zoukankan      html  css  js  c++  java
  • SpringBoot笔记

    官网:

    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:JavaAppapp.shop.javacorp argetshop-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 )
    
  • 相关阅读:
    【Java POI】POI基于事件驱动解析大数据量2007版本Excel,空值导致列错位问题
    【Java MyBatis Generator】使用generator自动生成Dao,Mapping和实体文件
    Java连接MQ的实例, 测试类
    与MQ通讯的完整JAVA程序
    MQ中将消息发送至远程队列的配置
    IBM MQ 使用指南
    Java调用MQ队列
    IBM MQ介绍
    HttpWebRequest和HttpWebResponse
    SQL SERVER中DBLINK的实现
  • 原文地址:https://www.cnblogs.com/newsea/p/8929953.html
Copyright © 2011-2022 走看看