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
猜测是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>