Java 在Spring中使用postForEntity时,错误的POST正文JSON序列化
我试图在Spring中通过POST body以JSON的形式发送对象的实例Java 在Spring中使用postForEntity时,错误的POST正文JSON序列化,java,json,spring,jackson,Java,Json,Spring,Jackson,我试图在Spring中通过POST body以JSON的形式发送对象的实例EGiftCreationRequest: final BigDecimal amount = new BigDecimal(100.00); final String configurationId = "test_configuration_id"; final String referenceNumber = "12345"; EGiftCreationRequest giftCre
EGiftCreationRequest
:
final BigDecimal amount = new BigDecimal(100.00);
final String configurationId = "test_configuration_id";
final String referenceNumber = "12345";
EGiftCreationRequest giftCreationRequest = new EGiftCreationRequest() {{
giftAmount(amount);
productConfigurationId(configurationId);
retrievalReferenceNumber(referenceNumber);
}};
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<EGiftCreationRequest> httpEntity = new HttpEntity<EGiftCreationRequest>(giftCreationRequest, headers);
ResponseEntity<EGift> entity = new TestRestTemplate().postForEntity(
"http://localhost:" + this.port + "/eGiftProcessing/v1/generateEGift",
httpEntity,
EGift.class
);
显然,这与我的EGiftCreationRequest
无关,它实际上是:
public class EGiftCreationRequest extends RequestBase<EGiftCreationRequest> {
private BigDecimal giftAmount;
private String productConfigurationId;
private String retrievalReferenceNumber;
public BigDecimal giftAmount() {
return this.giftAmount;
}
public String productConfigurationId() {
return this.productConfigurationId;
}
public String retrievalReferenceNumber() {
return this.retrievalReferenceNumber;
}
public EGiftCreationRequest giftAmount(final BigDecimal giftAmount) {
this.giftAmount = giftAmount;
return this;
}
public EGiftCreationRequest productConfigurationId(final String productConfigurationId) {
this.productConfigurationId = productConfigurationId;
return this;
}
public EGiftCreationRequest retrievalReferenceNumber(final String retrievalReferenceNumber) {
this.retrievalReferenceNumber = retrievalReferenceNumber;
return this;
}
}
公共类EGiftCreationRequest扩展了RequestBase{
私人吉塔蒙特;
私有字符串productConfigurationId;
私有字符串检索引用编号;
公共BigDecimal giftAmount(){
返回此giftAmount;
}
公共字符串productConfigurationId(){
返回此.productConfigurationId;
}
公共字符串检索ReferenceNumber(){
返回此.retrievalReferenceNumber;
}
公共EGiftCreationRequest giftAmount(最终大十进制giftAmount){
this.giftAmount=giftAmount;
归还这个;
}
public EGiftCreationRequest productConfigurationId(最终字符串productConfigurationId){
this.productConfigurationId=productConfigurationId;
归还这个;
}
public egiftCreationRequestRetrievalReferenceNumber(最终字符串retrievalReferenceNumber){
this.retrievalReferenceNumber=retrievalReferenceNumber;
归还这个;
}
}
可能发生了什么?这是由配置错误的Jackson映射器引起的。默认情况下,Jackson正在寻找以JavaBeans方式命名的访问器(get*(),set*())来检索和设置值。由于模型使用不同的命名约定(字段名称本身),Jackson无法序列化对象 以下映射器配置使一切正常工作:
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE);
TestRestTemplate testRestTemplate = new TestRestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJackson2HttpMessageConverter(mapper));
testRestTemplate.setMessageConverters(messageConverters);
ObjectMapper mapper=new ObjectMapper();
setSerializationInclusion(JsonInclude.Include.NON_NULL);
configure(在未知属性上反序列化feature.FAIL,false);
setVisibility(PropertyAccessor.FIELD,jsonautodect.Visibility.ANY);
setVisibility(PropertyAccessor.GETTER、jsonautodect.Visibility.NONE);
setVisibility(PropertyAccessor.SETTER,jsonautodect.Visibility.NONE);
setVisibility(PropertyAccessor.CREATOR,jsonautodect.Visibility.NONE);
TestRestTemplate TestRestTemplate=新的TestRestTemplate();
列表>();
添加(新映射Jackson2HttpMessageConverter(映射器));
setMessageConverters(messageConverters);
根据给出的信息,除非有人看到了完全相同的行为,否则很难给出答案。可以提供帮助的是调试语句、控制器的完整代码和非常基本的代码—只需在IDE中调试代码即可。您的类路径中有jackson json jar吗?
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.NONE);
TestRestTemplate testRestTemplate = new TestRestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
messageConverters.add(new MappingJackson2HttpMessageConverter(mapper));
testRestTemplate.setMessageConverters(messageConverters);