lat*_*ell 3 json jax-rs jersey-client
我有一个JAX-RS WebService,使用以下方法:
@Path("/myrest")
public class MyRestResource {
...
@GET
@Path("/getInteger")
@Produces(APPLICATION_JSON)
public Integer getInteger() {
return 42;
}
Run Code Online (Sandbox Code Playgroud)
使用此剪切访问时:
@Test
public void testGetPrimitiveWrapers() throws IOException {
// this works:
assertEquals(new Integer(42), new ObjectMapper().readValue("42", Integer.class));
// that fails:
assertEquals(new Integer(42), resource().path("/myrest/getInteger").get(Integer.class));
}
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: A message body reader for Java class java.lang.Integer, and Java type class java.lang.Integer, and MIME media type application/json was not found
com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are: application/json
...
Run Code Online (Sandbox Code Playgroud)
问题在于返回单个原始值(int/boolean)或它们的包装类.返回其他POJO类不是问题所以我想所有关于JSONConfiguration.FEATURE_POJO_MAPPING和JAXB注释的答案都不适用于此处.或者,如果我无法访问其类源,我应该使用哪个注释来描述返回类型?
使用ngrep我可以验证webservice只返回字符串"42".这是一个有效的JSON"值",但根据规范,它不是有效的JSON"文本".那么我在客户端或服务器端的问题是什么?
我尝试根据http://tugdualgrall.blogspot.de/2011/09/jax-rs-jersey-and-single-element-arrays.html激活JSONConfiguration自然/ badgerfish,但没有成功(ngrep仍然只显示"42" ).这是正确的道路吗?
任何想法都表示赞赏!
这是杰克逊公认的一个错误,它已经被吹捧(在我看来是错误的)作为一个功能.为什么我认为这是一个错误?因为虽然序列化工作,反序列化肯定不会.
无论如何,无法从当前的返回类型生成有效的JSON,因此我建议创建一个包装类:
class Result<T> {
private T data;
// constructors, getters, setters
}
@GET
@Path("/getInteger")
@Produces(APPLICATION_JSON)
public Result<Integer> getInteger() {
return new Result<Integer)(42);
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以选择包装根值,这将自动将您的数据封装在顶级JSON对象中,由对象简单类型名称键入 - 但请注意,如果使用此选项,则将包装所有生成的JSON(不仅仅是原语):
final ObjectMapper mapper = new ObjectMapper()
.configure(SerializationFeature.WRAP_ROOT_VALUE, true)
.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
final String serializedJson = mapper.writeValueAsString(42);
final Integer deserializedVal = mapper.readValue(serializedJson,
Integer.class);
System.out.println(serializedJson);
System.out.println("Deserialized Value: " + deserializedVal);
Run Code Online (Sandbox Code Playgroud)
输出:
{"整数":42}
反序列化值:42
有关如何在JAX-RS环境中检索和配置实例的详细信息,请参阅此答案ObjectMapper.
| 归档时间: |
|
| 查看次数: |
4238 次 |
| 最近记录: |