JAX-RS响应HTTP状态码500而不是HTTP状态码400

6
有时候JAR-RS客户端发送了错误的语法请求体。服务器应该回应HTTP状态码400(错误请求),但它回应HTTP状态码500(内部服务器错误)
代码:
JAX-B模型类:
@XmlRootElement(namespace = "http://www.test.com/test")
@XmlAccessorType(value = XmlAccessType.FIELD)
public class TestModel {

    @XmlElement
    private String id;
}

JAX-RS资源类:
@Path("test")
public class TestResource {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public void create(TestModel testModel) {
        // some code
    }
}

CXF配置:

<jaxrs:server address="/rest" id="test" staticSubresourceResolution="true">
    <jaxrs:serviceBeans>
        <ref bean="testResource" /> 
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider" />
    </jaxrs:providers>
</jaxrs:server>

例子:

请求正文:

{"id2": "test"}

"

id2错误,客户端应该得到HTTP状态码400,但是它得到了HTTP状态码500

服务器日志:

"
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "id2" (class test.TestModel), not marked as ignorable (one known property: "id"])
    at [Source: org.apache.cxf.transport.http.AbstractHTTPDestination$1@6f30793d; line: 1, column: 10] (through reference chain: test.TestModel["id2"])
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)
    at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:839)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1045)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1352)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1330)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:264)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:125)
    at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1470)
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:912)
    at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:811)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1343)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1294)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:826)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:789)
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212)
    ... 68 more

有没有一种方法可以配置Jackson和/或CXF,在没有模式验证bean验证的情况下返回HTTP状态400,以针对错误的语法请求体?
1个回答

4
问题在于那些未被映射为响应的异常(通过 ExceptionMapper),会转换为通用的服务器错误响应,因为运行时不知道该如何处理异常。 jackson-jaxrs-provider 模块有 ExceptionMapper 来处理 Jackson 基础异常类 JsonMappingExceptionJsonParseException。这些映射器分别是 JsonMappingExceptionMapperJsonParseExceptionMapper。这些映射器将异常映射为 400 响应,并将异常消息作为响应主体。如果您不喜欢这个响应主体,可以编写自己的映射器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接