2016-04-26 19 views
4

JAR-RSクライアントが間違った構文要求本体を送信していることがあります。サーバーはHTTP status 400 (Bad Request)で応答する必要がありますが、HTTP status 500 (Internal Server Error)と応答します。HTTPステータス400ではなくHTTPステータス500のJAX-RS応答

コード:

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 status 400を取得する必要がありますが、それはHTTP status 500を取得します。

Serverログ:

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.AbstractHTTPD[email protected]; 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 

はジャクソンおよび/またはCXFはschema validationまたはbean validationずに間違った構文リクエストボディのためにHTTPステータス400を返すように設定する方法はありますか?

答えて

2

問題は、応答にマップされていない例外(ExceptionMapper)は、一般的なサーバーエラー応答に変換されるという点です。ランタイムは例外の処理方法を知らないためです。

jackson-jaxrs-providerモジュールは、Jacksonベース例外クラスJsonMappingExceptionおよびJsonParseExceptionを処理するためにExceptionMapperです。マッパーはそれぞれJsonMappingExceptionMapperJsonParseExceptionMapperです。これらのマッパーは、レスポンス本文として例外メッセージとともに400レスポンスに例外をマップします。このレスポンスボディが気に入らなければ、自分のマッパーを書くことができます。

関連する問題