Jersey+JAXB客户端发送布尔值至.NET API时true被转为false
问题分析
从日志输出能看到两个核心问题:
- 请求的JSON字段名是
"value",而非POJO定义的isValue,导致.NET服务端无法正确映射到对应属性,默认赋值为false - 布尔值被序列化为字符串类型
"true",而非JSON原生布尔类型true,这也可能引发.NET模型绑定异常
解决方案
1. 修正JSON字段名匹配问题
JAXB默认会把getIsValue()/setIsValue()这类布尔属性的序列化字段名去掉is前缀,生成value。需要显式指定字段名,让它和.NET服务端的属性名一致:
修改GetBoolTest类的字段或setter方法,添加@XmlElement(name = "isValue")注解:
@XmlRootElement public class GetBoolTest { @XmlElement(name = "isValue") protected Boolean isValue; // 构造方法、getter、setter 保持不变 }
或者在setter上添加注解:
@XmlElement(name = "isValue") public void setIsValue(Boolean isValue) { this.isValue = isValue; }
2. 修复布尔值序列化类型问题
Jersey默认的JAXB JSON处理会将Boolean类型序列化为字符串,改用Jackson作为JSON提供者可以解决这个问题,同时提升和.NET JSON的兼容性:
针对Jersey 1.x:
添加Jackson依赖(根据你的Jersey版本适配Jackson版本):
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-jaxrs</artifactId> <version>1.9.13</version> </dependency>
然后在客户端配置中注册Jackson的JSON提供者:
ClientConfig config = new DefaultClientConfig(); config.getClasses().add(org.codehaus.jackson.jaxrs.JacksonJsonProvider.class); Client client = Client.create(config);
针对Jersey 2.x:
添加Jackson依赖:
<dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.15.2</version> </dependency>
注册Jackson提供者:
ClientConfig config = new ClientConfig(); config.register(com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider.class); Client client = ClientBuilder.newClient(config);
3. 修正Content-Type头的错误
代码中设置的Content-Type头多了一个多余的减号,修正为:
.header("Content-Type", "application/json; charset=UTF-8")
验证
修改后,请求的JSON会变为{"isValue":true},和Postman发送的格式一致,此时.NET服务端就能正确接收布尔值true,返回的响应也会对应正确结果。
内容的提问来源于stack exchange,提问作者Hooman Yarahmadi
相关产品推荐
相关产品推荐

