Spring Integration传递自定义对象至HttpRequestExecutingMessageHandler时出现406 Null问题
嘿,我来帮你搞定这个HttpRequestExecutingMessageHandler传自定义对象时出现的406 Null错误!结合你的代码来看,这个问题大概率和请求内容协商、对象序列化配置有关,咱们一步步来排查解决:
先搞懂406错误的本质
406 Not Acceptable 通常表示服务器没法生成客户端请求头里Accept字段指定格式的响应,但你是在POST传参时触发的,更可能是请求的Content-Type不对,或者自定义的User对象没法被正确序列化/反序列化,导致服务器解析不了请求体,进而返回异常。检查HttpRequestExecutingMessageHandler的请求配置
你的Spring Controller用了@RequestBody接收参数,意味着它只认JSON格式的请求体,所以必须确保请求发送时配置了正确的请求头和消息转换器:HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://localhost:8080/accountbalance/exp"); handler.setHttpMethod(HttpMethod.POST); // 设置请求Content-Type为application/json HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); handler.setHeaders(headers); // 配置Jackson消息转换器,确保能将User对象序列化为JSON List<HttpMessageConverter<?>> converters = new ArrayList<>(); converters.add(new MappingJackson2HttpMessageConverter()); handler.setMessageConverters(converters);检查自定义User类的序列化合法性
Jackson要正确解析请求体,User类必须是符合要求的POJO:- 要有公共的无参构造函数(Jackson默认用这个构造实例)
- 字段要有对应的getter和setter方法
示例正确的User类:
public class User { private String name; // 对应你Controller里接收的字段 // 必须的无参构造 public User() {} // getter和setter public String getName() { return name; } public void setName(String name) { this.name = name; } }验证本地服务接口本身是否正常
你可以先用Postman这类工具直接调用/accountbalance/exp接口,发送JSON格式的请求体(比如{"name": "test"}),看看能不能正常响应。如果直接调用也有问题,那就要排查你的Controller或者AccountBalanceDetailsRepo的逻辑了,比如确认accountBalanceDetailsRepo的查询结果不为null。额外排查点:请求体是否为null
在发送请求前,打印一下要传递的User对象内容,确认它不是null。如果对象本身是null,服务器自然会解析出null,也可能触发异常。
按照上面的步骤逐一排查,应该就能解决这个406的问题啦!
内容的提问来源于stack exchange,提问作者Amar Dev

