文档章节

SpringBoot笔记

o
 osc_z1hvg4cu
发布于 2018/04/24 14:14
字数 1038
阅读 3
收藏 0

精选30+云产品,助力企业轻松上云!>>>

官网:

http://springboot.fun/

打包

<build>
        <sourceDirectory>${project.basedir}/src</sourceDirectory>
        <resources>
            <resource>
                <directory>resources</directory>
            </resource>
        </resources>
</build>

build 必须包含 sourceDirectory , resources , 才能打包进 jar 包。

收集到一个比较全的:

https://blog.csdn.net/xiaoyu411502/article/details/52474037

Idea 中 SpringBoot 方式启动与 Application 启动的区别

SpringBoot 启动, 命令多了以下参数 :

-XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=55414 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true

遇到一个问题. SpringBoot方式启动没有错误. Application启动报错: Caused by: java.lang.ClassNotFoundException: kotlin.reflect.KotlinReflectionInternalError

对比发现: Application上添加 -noverify 就可以了.

调试

  • springboot 传参,如果参数是空的, 则不写 =

  • 代理模式用的方法: Proxy.newProxyInstance

  • 在SpringBoot2.0及Spring 5.0 WebMvcConfigurerAdapter已被废弃,目前找到解决方案就有两种

https://blog.csdn.net/lenkvin/article/details/79482205

  • HttpServlet 定义URL @ServletComponentScan 配合 @WebServlet ,再使用 HttpServlet

https://www.cnblogs.com/NeverCtrl-C/p/8191920.html

  • Thread.currentThread().contextClassLoader.getResource("").path

三种环境(通过 Thread.currentThread().contextClassLoader.getResource("").protocol 判断)(.path 和 .file 是相同的)

  • jar : file:/D:/JavaApp/app.shop.java/corp/target/shop-corp-3.0.0.jar!/BOOT-INF/classes!/
  • war : 没调呢。
  • file : /D:/JavaApp/pzx.java/entity/target/classes/

Jar包的情况, 可以通过获取私有字段: handler.jarFile.name 获取到: D:\JavaApp\app.shop.java\corp\target\shop-corp-3.0.0.jar

  • bootstrap.yml 早于 applicatoin.yml

http://www.jb51.net/article/139112.htm

SpringMvc 设置消息转换 设置返回Json的格式。

在所有的消息转换中找到目标,再修改。

       @Autowired
       lateinit var converter: MappingJackson2HttpMessageConverter

        //注册返回的消息体。
        handerAdapter.messageConverters.filter { it is MappingJackson2HttpMessageConverter }.map { it as MappingJackson2HttpMessageConverter }.forEach {
            it.objectMapper.registerModule(CustomModule())


@Component
class CustomModule() : SimpleModule(PackageVersion.VERSION) {
    init {
        addSerializer(ObjectId::class.java, ObjectIdJsonSerializer());
        addSerializer(LocalDate::class.java, LocalDateJsonSerializer());
        addSerializer(LocalTime::class.java, LocalTimeJsonSerializer());
        addSerializer(LocalDateTime::class.java, LocalDateTimeJsonSerializer());

        addDeserializer(LocalDate::class.java, LocalDateJsonDeserializer())
        addDeserializer(LocalTime::class.java, LocalTimeJsonDeserializer())
        addDeserializer(LocalDateTime::class.java, LocalDateTimeJsonDeserializer())
    }
}

class LocalTimeJsonSerializer : JsonSerializer<LocalTime>() {
    override fun serialize(value: LocalTime?, generator: JsonGenerator, serializers: SerializerProvider) {
        if (value == null) {
            generator.writeNull()
        } else {
            generator.writeString(value.AsString())
        }
    }
}
        }

设置默认字符集

        //设置 StringHttpMessageConverter 的字符集
        handerAdapter.messageConverters.filter { it is StringHttpMessageConverter }.map { it as StringHttpMessageConverter }.forEach {
            it.setWriteAcceptCharset(false)
            it.defaultCharset = Charset.forName("utf-8")
        }

设置请求参数与Action函数参数对应关系

var listResolvers = mutableListOf<HandlerMethodArgumentResolver>()
        listResolvers.add(RequestParameterConverter(listOf(ApiParam::class.java)));

        listResolvers.addAll(handerAdapter.argumentResolvers ?: listOf())

        handerAdapter.argumentResolvers = listResolvers;

执行 Test 的时候, Bean 不创建的问题

设置 test resource , 重新 import 会失效.

在 project structure -> module -> 设置 test resources 时,下面有提示. 任何改变都会让它失效. 所以. 设置 test resource 是最后一步.

classLoader

Thread.currentThread().contextClassLoader 有 私有字段 classes ,表示加载之后的类。 类的加载有过程,在 Test 环境下,发现有的项目在执行Test时,当前项目的类并没有完全加载。

Bean的初始化.

调试中发现, Bean 并没有自动创建 .

解决

启动类上,添加 @Import ,让它强制执行,可以让该 Bean 强制创建 . 这种方法没有解决根本问题, 因为有大量的Bean.

找到原因如下: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描的。 所以,

  • 把 Test 的启动类的包名,改为 Bean 的顶级包名即可. 如: Bean包名: com.abc.def , Test启动类包名: com.abc 或 com 均可.

  • 或者 @ComponentScan(basePackages=arrayOf("com","org")) 经测试, 这个方法在 spring-boot 下不行。

  • 使用: @SpringBootApplication(scanBasePackages = arrayOf("nbcp","pandian")) scanBasePackages 写所有启动加载的包。

见: https://zhidao.baidu.com/question/716351765859826445.html

定时任务总开关

https://my.oschina.net/jspp/blog/1604553 上文说的测试了一下,没有效果.

@Component open class

对于 @Component 注解的 class ,一定不能是 final , 必须是 open的. 因为Srping会使用 cglib 继承自该类, 重写该类的方法.

取消Filter自动注册

https://www.jianshu.com/p/bf79fdab9c19

取消自动连接数据库:

https://blog.csdn.net/u012240455/article/details/82356075

@EnableAutoConfiguration(exclude = arrayOf(DataSourceAutoConfiguration::class))

新建非Web SpringBoot项目.

http://www.jianshu.com/p/5d4ffe267596 继承 CommandLineRunner

@SpringBootApplication
class SpringBootConsoleApplication : CommandLineRunner {

    companion object {
        @Throws(Exception::class)
        @JvmStatic
        fun main(args: Array<String>) {
            //disabled banner, don't want to see the spring logo
            val app = SpringApplication(SpringBootConsoleApplication::class.java)
            app.setBannerMode(Banner.Mode.OFF)
            app.run(*args)

        }
    }

    // Put your logic here.
    @Throws(Exception::class)
    override fun run(vararg args: String) {

        fixTagData()

        exit(0)
    }
}

EnableRedisHttpSession

Redis数据库会有: spring:session:sessions:2519c4cb-4dfb-42c7-9c19-334cc2800e54 的 Hash数据。里有有以下Field: maxInactiveInterval sessionAttr:ValidateCode lastAccessedTime sessionAttr:PzxSession creationTime

Java如何读出?
读出字符串容易: var d = rer.jedis(11).jedis.hget("spring:session:sessions:" + id, "sessionAttr:PzxSession")。 
反序列化。 ObjectInputStream( ByteArrayInputStream(d.toByteArray().toMutableList().slice(6).toByteArray())).readObject() 报错: invalid stream header: EFBFBDEF, 因为: 读出String的时候就已经错了。原因: https://www.cnblogs.com/yanlong300/p/7692595.html
如何读出二进制流?
var data = rer.jedis(11).jedis.hget (("spring:session:sessions:" + id).toByteArray(), "sessionAttr:PzxSession".toByteArray())
var stream = ObjectInputStream(ByteArrayInputStream(data));
var ent = stream.readObject() as PzxSessionData;

JSessionID 的值 。

JSESSIONID == Base64( request.requestSessionId )

spring:session:sessions:${request.requestSessionId}

spring:session:sessions:${request.requestSessionId}. sessionAttr:${ session.key } == serial ( session.value )
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Springboot学习笔记

Springboot学习笔记(一)-线程池的简化及使用 Springboot学习笔记(二)-定时任务 Springboot学习笔记(三)-常用注入组件方式 Springboot学习笔记(四)-配置相关 Springboot学习笔记(五)...

舒山
2018/05/19
0
0
Java程序员必备的魔鬼文档,springboot核心资料,清晰!齐全!已跪!

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这...

wx5d6cccb1cb158
05/20
0
0
Java程序员必备的魔鬼文档,springboot核心资料,清晰!齐全!已跪!

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这...

wx5d6cccb1cb158
05/20
0
0
【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知识点,能有简单的、完整的、可快速运行...

osc_evi50j4g
2018/07/28
2
0
spring boot Websocket(使用笔记)

spring boot Websocket(使用笔记) 本文只作为个人笔记,大部分代码是引用其他人的文章的。 在springboot项目中使用websocket做推送,虽然挺简单的,但初学也踩过几个坑,特此记录。   使...

Airship
2019/10/16
21
0

没有更多内容

加载失败,请刷新页面

加载更多

asp.net core之NLog

NuGet添加 NLog.Web.AspNetCore。 <PackageReference Include="Microsoft.AspNetCore.App" /> 添加配置文件 新建一个文件nlog.config(建议全部小写,linux系统中要注意), 并右键点击其属性......

一介草民Coder
49分钟前
23
0
.NET中的struct和class有什么区别? - What's the difference between struct and class in .NET?

问题: .NET中的struct和class有什么区别? 解决方案: 参考一: https://stackoom.com/question/3OT/NET中的struct和class有什么区别 参考二: https://oldbug.net/q/3OT/What-s-the-differ...

富含淀粉
今天
23
0
android:layout_weight是什么意思? - What does android:layout_weight mean?

问题: I don't understand how to use this attribute. 我不明白如何使用这个属性。 Can anyone tell me more about it? 谁能告诉我更多关于它的事情? 解决方案: 参考一: https://stacko...

javail
今天
17
0
CSS背景不透明度[重复] - CSS Background Opacity [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: How do I give text or an image a transparent background using CSS? 如何使用CSS为文本或图像提供透明背...

fyin1314
今天
31
0
node http 获取gb2312网页如何转为utf8

最初,我想当然认为是下述做法,但被证明是错误的 const http = require('http'), iconv = require('iconv-lite');const url = 'http://xxx';http.get(url, function(res) { var bo......

高延
今天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部