SpringBoot开发经验

92 阅读2分钟

SpringBoot那些你想错方向的问题

打包成war还不够

idea启动很正常, 打包成jar放到服务器上也正常, 就是打包成war放到tomcat下访问404找不到资源.

解决办法: 如果你要将项目打包成war包放在tomcat上执行,这个类得继承一下SpringBootServletInitializer,并重写configure方法,如下:

@SpringBootApplication()
public class LocalserviceApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(LocalserviceApplication.class, args);
    }

    // 按照下面的方式重写
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(LocalserviceApplication.class);
    }

}

@SerializedName在接口中失效(接口对象转换部分字段为null)

接口对应的方法定义为这样

@PostMapping(value = "/transfer/batches")
public ResponseResult payBatches(@RequestBody InitiateBatchTransferRequest request) {...}

微信SDK定义的请求对象类似这样

public class InitiateBatchTransferRequest {
    @SerializedName("appid")
    private String appid;
    @SerializedName("out_batch_no")
    private String outBatchNo;
    @SerializedName("batch_name")
    private String batchName;
}

请求的body为

{
	"appid": "wxbxxx",
	"out_batch_no": "lhb0001",
	"batch_name": "测试",
	"batch_remark": "测试",
	"total_amount": 1,
	"total_num": 1,
	"transfer_detail_list": [
		{
			"out_detail_no": "001",
			"transfer_amount": 1,
			"transfer_remark": "test",
			"openid": "xxx"
		}
	]
}

出现问题为下图提示, 经调试发现controler中接口收到的发InitiateBatchTransferRequest对象只有appid正常,其他都为null 2024-01-27_21-36.png 猜测是body中的key未对应, 将out_batch_no改为outBatchNo后正常.

于是查了一些"springboot @SerializedName失效"的资料, 后根据Springboot强大的类型转换功能你必须要掌握Converter SPI写了一个并验证成功了. 但是这样要为很多request对象手动编写, 这不符合sprinboot的风格啊.于是改变了一下思路,搜索"springboot controller支持gson反序列化",找到了在 Spring Boot 中使用 Gson 替换 Jackson才豁然开朗.

去掉tomcat访问的项目名称

tomcat的项目名看着很烦 解决办法: 在Engine内的Host内增加一个Context标签, path就是空, docBase使用相对路径(如下代码)或绝对路径

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="./yilv/" debug="0" reloadable="true"></Context>
      </Host>
    </Engine>