У меня есть JAX-RS WebService со следующим методом:
@Path("/myrest")
public class MyRestResource {
...
@GET
@Path("/getInteger")
@Produces(APPLICATION_JSON)
public Integer getInteger() {
return 42;
}
При доступе с помощью этого фрагмента:
@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));
}
Я получаю следующее исключение:
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
...
Проблема заключается только в возврате одиночных примитивных значений (int/boolean) или их классов-оболочек. Возврат других классов POJO не является проблемой, поэтому я думаю, что все ответы, касающиеся аннотаций JSONConfiguration.FEATURE_POJO_MAPPING и JAXB, здесь не применяются. Или какую аннотацию я должен использовать для описания возвращаемого типа, если у меня нет доступа к его источнику класса?
Используя ngrep, я могу убедиться, что веб-сервис возвращает только строку «42». Это допустимое «значение» JSON, но не допустимый «текст» JSON в соответствии со спецификацией. Так моя проблема на стороне клиента или на стороне сервера?
Я попытался активировать JSONConfiguration natural/badgerfish согласно http://tugdualgrall.blogspot.de/2011/09/jax-rs-jersey-and-single-element-arrays.html, но безуспешно (ngrep по-прежнему показывает только «42»). Будет ли это правильным путем?
Любые идеи приветствуются!
@Produces("text/plain")
. Если вам действительно нужен тип носителя application/json, вы можете написать собственный MessageBodyWriter. - person bdkosher   schedule 07.05.2013