Spring启动使用错误的消息转换器

时间:2018-04-09 09:55:57

标签: rest spring-boot jaxb marshalling jaxb2

我有一个像下面这样的休息端点,它应该接受XML输入,对它进行一些处理,然后以XML格式返回响应。

@RequestMapping(value = "/rest/v1/test/listener", method = RequestMethod.POST)
public ResponseEntity<MyResponseType> processBooking(@RequestBody MyRequest myRequest) throws JAXBException {
    MyResponseType response = myService.process(myRequest);
    // ... do something with it and generate 'response' 
    return new ResponseEntity<>(response, HttpStatus.OK);
}

MyRequest类如下所示,它是通过jaxb和外部xsd自动生成的,我无法更改(详细信息从类中省略)

/**
 * MyRequest
 */
public class MyRequest {

    @XmlElement(required = true)
    @XmlSchemaType(name = "string")
    protected SomeEnum someEnum;

    ...

    @XmlType(name = "SomeEnum")
    @XmlEnum
    public enum SomeEnum {

        ACTIVITY,
        DEPOSIT,
        EQUIPMENT,
        FEE,
        MISC,
        PROTECTION,
        RENTAL,
        TAX,
        DISCOUNT;

        public static SomeEnum fromValue(String v) {
            return valueOf(v);
        }

        public String value() {
            return name();
        }
    }

}

问题是,当我尝试运行它时,我收到以下错误消息

  

2018-04-09 11:47:59.378 WARN 2702 --- [主要]   .w.s.m.s.DefaultHandlerExceptionResolver:无法读取HTTP   信息:   org.springframework.http.converter.HttpMessageNotReadableException:   JSON解析错误:无法构造MyRequest.SomeEnum的实例:no   从String反序列化的String-argument构造函数/工厂方法   价值(&#39; MISC&#39;);嵌套异常是   com.fasterxml.jackson.databind.JsonMappingException:无法构造   MyRequest.SomeEnum的实例:没有String-argument构造函数/工厂   从String值反序列化的方法(&#39; MISC&#39;)

我作为输入发送的示例xml是

<myRequest>
    ...
    <advertiserAssignedId>19ABC12331</advertiserAssignedId>
    <listingExternalId>ABC123</listingExternalId>
    <unitExternalId>ABC123</unitExternalId>
    <someEnum>
        <name>MISC</name>
        <feeType>MISC</feeType>
        ...
    </someEnum>

    ... 
</myRequest>

1 个答案:

答案 0 :(得分:0)

您必须使用consumes attribut指定您的终端消费内容。

当您将请求发布到您的终端时,请不要忘记将Content-type标题设置为application/xml