http://springboot.fun/html
# 打包java
<build> <sourceDirectory>${project.basedir}/src</sourceDirectory> <resources> <resource> <directory>resources</directory> </resource> </resources> </build>
build 必须包含 sourceDirectory , resources , 才能打包进 jar 包。web
收集到一个比较全的:redis
https://blog.csdn.net/xiaoyu411502/article/details/52474037spring
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=truejson
遇到一个问题. SpringBoot方式启动没有错误. Application启动报错:
Caused by: java.lang.ClassNotFoundException: kotlin.reflect.KotlinReflectionInternalErrorbootstrap
对比发现: Application上添加 -noverify 就能够了.springboot
springboot 传参,若是参数是空的, 则不写 =session
代理模式用的方法: Proxy.newProxyInstance
在SpringBoot2.0及Spring 5.0 WebMvcConfigurerAdapter已被废弃,目前找到解决方案就有两种
https://blog.csdn.net/lenkvin/article/details/79482205
https://www.cnblogs.com/NeverCtrl-C/p/8191920.html
三种环境(经过 Thread.currentThread().contextClassLoader.getResource("").protocol 判断)(.path 和 .file 是相同的)
Jar包的状况, 能够经过获取私有字段: handler.jarFile.name 获取到: D:\JavaApp\app.shop.java\corp\target\shop-corp-3.0.0.jar
http://www.jb51.net/article/139112.htm
在全部的消息转换中找到目标,再修改。
@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") }
var listResolvers = mutableListOf<HandlerMethodArgumentResolver>() listResolvers.add(RequestParameterConverter(listOf(ApiParam::class.java))); listResolvers.addAll(handerAdapter.argumentResolvers ?: listOf()) handerAdapter.argumentResolvers = listResolvers;
在 project structure -> module -> 设置 test resources 时,下面有提示. 任何改变都会让它失效. 因此. 设置 test resource 是最后一步.
Thread.currentThread().contextClassLoader 有 私有字段 classes ,表示加载以后的类。 类的加载有过程,在 Test 环境下,发现有的项目在执行Test时,当前项目的类并无彻底加载。
调试中发现, 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 注解的 class ,必定不能是 final , 必须是 open的. 由于Srping会使用 cglib 继承自该类, 重写该类的方法.
https://www.jianshu.com/p/bf79fdab9c19
https://blog.csdn.net/u012240455/article/details/82356075
@EnableAutoConfiguration(exclude = arrayOf(DataSourceAutoConfiguration::class))
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) } }
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 == Base64( request.requestSessionId ) spring:session:sessions:${request.requestSessionId} spring:session:sessions:${request.requestSessionId}. sessionAttr:${ session.key } == serial ( session.value )