Тип boolean, а медиа-тип MIME application/octet-stream не найден Java (Джерси)

Я использую Джерси версии 1.12, и я сталкиваюсь с ошибкой, которая

A message body writer for Java class java.lang.Boolean, and Java type boolean, and MIME media type application/octet-stream was not found

    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1451)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1363)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1353)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:414)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:708)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

мой код

        @POST
        @Path("/save/{Name}/{data}")
        @Consumes("application/x-www-form-urlencoded")
        public String saveDataMap(@QueryParam("number") String number,
        @PathParam("data") String data,
        @PathParam("Name") String appName
        MultivaluedMap<String, String> formParam) throws Exception{
        boolean response =false'
        try{
        // some business logic
        response =true
        }

        return response;
        }

После поиска в Google этой ошибки я обнаружил, что это связано с тем, что вы не указываете тип содержимого данных, которые вы отправляете, поэтому Джерси не может найти правильный MessageBodyWritter для сериализации

после этого я добавил, что создает аннотацию к методу с MediaType.TEXT_PLAIN, но он не работает, но когда я изменил тип возврата метода на String, он начал работать.

Я просто хочу знать, в чем проблема с логическим значением, почему оно не работает с логическим значением? и как решить эту проблему, не меняя логическое значение на String?

Любая помощь будет оценена.


person Ali    schedule 08.07.2015    source источник


Ответы (1)


Обычно я кодирую эти методы следующим образом:

    @POST
    @Path("/save/{Name}/{data}")
    @Consumes("application/x-www-form-urlencoded")
    @Produces(MediaType.TEXT_PLAIN)
    public Response saveDataMap(@QueryParam("number") String number,
    @PathParam("data") String data,
    @PathParam("Name") String appName
    MultivaluedMap<String, String> formParam) throws Exception{
    boolean response =false
    try{
    // some business logic
    response =true
    }

    return Response.ok().entity(String.valueOf(response)).build();
    }

Единственное изменение заключается в том, что он возвращает HTTP-ответ трикотажа, строя его из строки из логического значения.

Я надеюсь, что это помогает.

С уважением, Крис.

person crigore    schedule 08.07.2015
comment
он по-прежнему возвращает строку, но мой вопрос: почему не логическое значение?? указанный вами способ аналогичен изменению типа возвращаемого значения метода на строку, оба работают одинаково - person Ali; 08.07.2015
comment
Мое лучшее предположение будет таким: потому что для логического значения нет MIME-типа, и вы должны преобразовать его во что-то, понятное браузерам. Но, это моя дикая догадка. - person crigore; 08.07.2015
comment
Изучение списков рассылки предполагает, что причина действительно в этом: java.net/projects/jersey/lists/users/archive/2009-08/message/34 - person Clive Evans; 08.07.2015