«Нет содержимого для сопоставления с объектом из-за конца ввода» при вызове WS REST - PullRequest
0 голосов
/ 08 февраля 2019

Рассмотрим следующий метод:

@POST
@Path("/device")
@Consumes("application/json")
@Produces("application/json")
public String putDevice(String jsonObject, @Context HttpHeaders headers, Admin admin)
{
    ObjectMapper mapper = new ObjectMapper();

    try
    {
        return updateDevice(mapper.readTree(jsonObject), Utils.extractUserInfo(headers), admin.getServer(), admin.getPort());
    }
    catch (JsonProcessingException e)
    {
        return e.getMessage();
    }
    catch (IOException e)
    {
        return e.getMessage();
    }
}

Когда я вызываю WS от Почтальона, я получаю следующее исключение:

08-Feb-2019 14: 23: 44.138GRAVE [http-nio-8080-exec-7] com.sun.jersey.spi.container.ContainerResponse.mapMappableContainerException Исключение, содержащееся в MappableContainerException, не может быть сопоставлено с ответом, повторно выбрасывая в контейнер HTTP java.io.EOFException: Нет содержимого для сопоставления с Object из-за конца ввода в org.codehaus.jackson.map.ObjectMapper._initForReading (ObjectMapper.java:2766) в org.codehaus.jackson.map.ObjectMapper._readValue (ObjectMapper.java:2682)в org.codehaus.jackson.map.ObjectMapper.readValue (ObjectMapper.java:1308) в org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom (JacksonJsonProvider.java:419) в com.sun.jersey.json.impl.pl..entity.JacksonProviderProxy.readFrom (JacksonProviderProxy.java:139) в com.sun.jersey.spi.container.ContainerRequest.getEntity (ContainerRequest.java:490) в com.sun.jersey.server.impl.model.method.dispatch.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider $ EntityParamInInvoker.getParams (AbstractResourceMethodDispatchProvider.java:153) в com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider $ TypeOutInvoker._dispatch (AbstractResourceMethodDispatchProvider.java: 183) на com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch (ResourceJavaMethodDispatcher.java:75) на com.sun.jersey.server.impl.uri.rules.HttpMetholet.java: 302) на com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept (RightHandPathRule.java:147) на com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept (ResourceClassRule.java: 108) на сервере com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept (RightHandPathRule.java:147) на com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept (RootResourceClassesRule.java:84) на com.sun.jersey.ser.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1542) в com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1473) в com.sun.jersey.serser.WebApplicationImpl.handleRequest (WebApplicationImpl.java:1419) на com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest (WebApplicationImpl.java:1409) на com.sun.jersey.spi.containebom(WebComponent.java:409) на com.sun.jersey.spi.container.servlet.ServletContainer.service (ServletContainer.java:558) на com.sun.jersey.spi.container.servlet.ServletContainer.service (ServletContainer.java): 733) в javax.servlet.http.HttpServlet.service (HttpServlet.java:742) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:231) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:166) в org.apache.tomcat.websocket.server.WsFilter.doFilter (WsFilache.g:::apap.g).catalina.core.ApplicationFilterChain.: 198) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:96) в org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:496) в org.apache.catalinaStandardHostValve.invoke (StandardHostValve.java:140) вorg.apache.catalina.valves.StandardEngineValve.java:87) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:342) в org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:803) в org.ap.AbstractProcessorLight.process (AbstractProcessorLight.java:66) в org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:790) в org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint): 1468) на org.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) на java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) на java.util.concolWorker.run (ThreadPoolExecutor.java:624) в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java: 61) at java.lang.Thread.run (Thread.java:748)

Возможно, важно упомянуть, что исключение исчезает, когда я удаляю параметр jsonObject и редактирую метод следующим образомэто:

@POST
@Path("/device")
@Consumes("application/json")
@Produces("application/json")
public Response putDevice(@Context HttpHeaders headers, Admin admin)
{
    String output = admin.toString();
    return Response.status(200).entity(output).build();
}

Любые предложения будут высоко оценены.

1 Ответ

0 голосов
/ 08 февраля 2019

Благодаря ссылке, опубликованной Арно, я узнал, что у вас может быть только один параметр без аннотации, и что он будет обрабатываться как тело запроса.Поэтому я внес необходимые изменения, и вот как теперь выглядит метод:

@POST
@Path("/device")
@Consumes("application/json")
@Produces("application/json")
public String putDevice(String jsonString, @Context HttpHeaders headers)
{
    ObjectMapper mapper = new ObjectMapper();
    try
    {
    JSONObject jsonObject = new JSONObject(jsonString);
    return updateDevice(mapper.readTree(jsonString),
                        Utils.extractUserInfo(headers),
                        jsonObject.getString("server"),
                        jsonObject.getInt("port"));
}
    catch (JSONException e)
    {
        return e.getMessage();
    }
    catch (JsonProcessingException e)
    {
        return e.getMessage();
    }
    catch (IOException e)
    {
        return e.getMessage();
    }
}

Я надеюсь, что однажды он поможет кому-то еще с той же проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...