Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring中使用postForEntity时,错误的POST正文JSON序列化_Java_Json_Spring_Jackson - Fatal编程技术网

Java 在Spring中使用postForEntity时,错误的POST正文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

我试图在Spring中通过POST body以JSON的形式发送对象的实例
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);