不确定该问题是否与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配置?