发生JsonMappingException时,CXF未返回错误响应

时间:2017-05-02 16:19:36

标签: java json spring jackson cxf

不确定该问题是否与CXF或Jackson有关。

我的控制器看起来像这样:

@Controller
@Produces(MediaType.APPLICATION_JSON)
public class MyController {    

    @GET
    @Path("test.json")
    public List<TestValue> test() {
        return newArrayList(new TestValue("A"), new TestValue("X"));
    }    

    private static class TestValue {
        private String value;    

        public enum Value {
            A, B, C
        }    

        public TestValue(String v) {
            value = v;
        }    

        public String getValue() {
            return Value.valueOf(value).toString();
        }
    }
}

我收到了这个回复:

❯ curl -v http://localhost:9100/test.json                                                                                                                                                               [18:09:53]
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 9100 (#0)
> GET /test.json HTTP/1.1
> Host: localhost:9100
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 02 May 2017 16:09:58 GMT
< Content-Type: application/json
< Transfer-Encoding: chunked
< Server: Jetty(9.3.z-SNAPSHOT)
< 
* Connection #0 to host localhost left intact
[{"value":"A"},{}]<ns1:XMLFault xmlns:ns1="http://cxf.apache.org/bindings/xformat"><ns1:faultstring xmlns:ns1="http://cxf.apache.org/bindings/xformat">com.fasterxml.jackson.databind.JsonMappingException: No enum constant MyController.TestValue.Value.X (through reference chain: java.util.ArrayList[1]->MyController$TestValue["value"])</ns1:faultstring></ns1:XMLFault>%                                                      

当然,回复是错误的,但更重要的是,我将200作为状态代码。

我知道在构造函数中获取Value实例并将value属性设置为Value而不是String会更好。 事实上,通过这样做,它可以正常工作,我收到400响应。

无论如何,我想确保即使被误用,我也没有得到200这样的请求。

我正在使用:

  • 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.8.8'
  • 'org.apache.cxf:cxf-rt-transports-http-jetty:3.1.11'

JacksonJaxbJsonProvider

我是否缺少一些CXF或Jackson配置?

0 个答案:

没有答案