ไม่มีเนื้อหาที่จะแมปกับออบเจ็กต์เนื่องจากการสิ้นสุดอินพุตเมื่อเรียก 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 จากบุรุษไปรษณีย์ ฉันได้รับข้อยกเว้นต่อไปนี้:

อาจเป็นเรื่องสำคัญที่ต้องพูดถึงว่าข้อยกเว้นหายไปเมื่อฉันลบพารามิเตอร์ 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();
}

ต้องขอบคุณลิงก์ที่โพสต์โดย Arnaud ฉันได้เรียนรู้ว่าคุณสามารถมีพารามิเตอร์ได้เพียงตัวเดียวโดยไม่มีคำอธิบายประกอบ และพารามิเตอร์นั้นจะถูกประมวลผลเป็นเนื้อหาคำขอ ดังนั้นฉันจึงทำการเปลี่ยนแปลงที่จำเป็น และตอนนี้วิธีการมีลักษณะดังนี้:


person Jesse James    schedule 08.02.2019    source แหล่งที่มา
comment
ขอบคุณสำหรับคำตอบ. อย่างไรก็ตาม ฉันไม่ได้ใช้สปริงที่นี่ มีทางเลือกอื่นสำหรับคำอธิบายประกอบนั้นหรือไม่?   -  person Arnaud    schedule 08.02.2019
comment
เห็นได้ชัดว่า พารามิเตอร์เดียวที่ไม่มีคำอธิบายประกอบจะเป็นคอนเทนเนอร์สำหรับคำขอ body ดูที่นี่ stackoverflow.com/questions/41157949/ ได้อย่างไร คุณไม่สามารถส่งหลายวัตถุด้วยวิธีนี้ได้ มีเพียงเนื้อหาคำขอเดียวเท่านั้น   -  person Jesse James    schedule 08.02.2019
comment
ลิงก์ที่คุณโพสต์ให้เบาะแสแก่ฉันในการแก้ไขปัญหา ขอบคุณ   -  person Arnaud    schedule 08.02.2019
comment
8 ก.พ. 2562 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(EntityParamDispatchProvider.java:123) ที่ com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:86) ที่ com.sun .jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInviver.getParams(AbstractResourceMethodDispatchProvider.java:153) ที่ com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInviver._disp atch (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.invoid(StandardWrapperValve.java:198) ที่ org.apache.catalina.core.StandardContextValve.inrigg(StandardContextValve.java:96) ที่ org.apache.catalina.authenticator.AuthenticatorBase.inurge(AuthenticatorBase.java:496) ที่ org.apache.catalina.core.StandardHostValve.invoid(StandardHostValve.java:140) ที่ org.apache.catalina.valves.ErrorReportValve.invoid(ErrorReportValve.java:81) ที่ org.apache.catalina.valves.AbstractAccessLogValve.inrigg (AbstractAccessLogValve.java:650) ที่ org.apache.catalina.core.StandardEngineValve.inurge(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