Нет содержимого для сопоставления с объектом из-за окончания ввода при вызове WS REST

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

@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 из Postman, я получаю следующее исключение:

Возможно, важно упомянуть, что исключение исчезает, когда я удаляю параметр 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();
}

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


person Jesse James    schedule 08.02.2019    source источник
comment
Спасибо за ваш ответ. Однако я не использую Spring здесь. Есть ли альтернатива этой аннотации?   -  person Arnaud    schedule 08.02.2019
comment
Судя по всему, единственным параметром без аннотации будет контейнер для тела запроса, см. здесь stackoverflow.com/questions/41157949/ . Вы не можете передать несколько объектов таким образом, есть только одно тело запроса.   -  person Jesse James    schedule 08.02.2019
comment
Ссылка, которую вы разместили, дала мне ключ к решению проблемы. Спасибо   -  person Arnaud    schedule 08.02.2019
comment
08 февраля 2019 г. 14:23:44.138 GRAVE [http-nio-8080-exec-7] com.sun.jersey.spi.container.ContainerResponse.mapMappableContainerException Исключение, содержащееся в MappableContainerException, не может быть сопоставлено с ответом, повторно выбрасывание в контейнер HTTP java.io.EOFException: нет содержимого для сопоставления с объектом из-за окончания ввода в 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.provider.entity.JacksonProviderProxy.readFrom(JacksonProviderProxy.java:139) на com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:490) на com.sun.jersey .server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(Ent ityParamDispatchProvider.java:123) по адресу com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:86) по адресу com.sun.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.HttpMethodRule.accept(HttpMethodRule.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.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl .java:1542) в com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) в com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419 ) на com.sun.jersey.server.impl.application. WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) в com.sun.jersey.spi.container.servlet.WebComponent.service(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(WsFilter .java:52) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) в org.apache.catalina. core.StandardWrapperValve.invoke(StandardWrapperValve.java:198 ) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) в org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) в org.apache.catalina.core.StandardHostValve. invoke(StandardHostValve.java:140) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) в org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650) в org.apache .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) в org.apache.coyote.http11.Http11Processor.service(Http11Processor.java :803) в org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) в org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) в org.apache.tomcat.util.net. NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468) в org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:624) в org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) в java.lang.Thread.run(Thread.java:748)   -  person Jesse James    schedule 08.02.2019


Ответы (1)


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

@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();
    }
}

Попробуйте добавить аннотацию

@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();
    }
}
: _2_ .

person Jesse James    schedule 08.02.2019