From: Jim Ma <em...@re...> - 2016-09-09 04:29:39
|
Hi, Sorry for the so late reply. We've moved the mailing list to user jboss mailing list: http://resteasy.jboss.org/mailinglists from May 2016. Did you try with add @Body annotation in TestData class and directly use the annotated filed in your service ? If @Body is not a required thing to use , can you simply try with the latest resteasy and directly send the json request which represents the TestData object ? I can't see why @Body is required here. Cheers, Jim > -------- Messaggio Inoltrato -------- > Oggetto: [Resteasy-users] How to use JSON message body in POST > Data: Thu, 21 Apr 2016 11:01:20 -0400 > Mittente: John Sipher <jas...@gm...> > A: res...@li... > > > > Hello, > > I'm trying to POST JSON data to a JAX-RS servlet running in WildFly > 8.2.0 (RESTEasy 3.0.10). I started out coding the method like this, > because this is what I see in every example I've found with Google > (this could mean I just have poor Google skills). > > @Path("/test") > @Consumes("application/json;charset=utf-8") > @Produces("application/json;charset=utf-8") > public Response execute(TestData data) { > AppResponse response = new AppResponse(); > // do some stuff > return Response.status(200).entity(response).build(); > } > > That failed because the > factory.getInjectorFactory().createParameterExtractor(parameter, > factory) call in this constructor always returned null, which caused a > NullPointerException when the request was processed. > public MethodInjectorImpl(ResourceLocator resourceMethod, > ResteasyProviderFactory factory) > { > this.factory = factory; > this.method = resourceMethod; > this.interfaceBasedMethod = > findInterfaceBasedMethod(resourceMethod.getResourceClass().getClazz(), > resourceMethod.getMethod()); > params = new ValueInjector[resourceMethod.getParams().length]; > int i = 0; > for (MethodParameter parameter : resourceMethod.getParams()) > { > params[i] = > factory.getInjectorFactory().createParameterExtractor(parameter, factory); > if (params[i] instanceof MessageBodyParameterInjector) > expectsBody = true; > i++; > } > } > > That was happening because parameter.paramType is ParamType.UNKNOWN. A > little more debugging led me to the @Body annotation. It looks like > adding @Body to the parameter would fix the problem, but @Body is only > valid for methods and fields, not parameters. So, I changed my code to > this > > @Bodyprivate TestData data; > @Path("/test") > @Consumes("application/json;charset=utf-8") > @Produces("application/json;charset=utf-8") > public Response execute() { > AppResponse response = new AppResponse(); > // do some stuff > return Response.status(200).entity(response).build(); > } > > That "works" (my method is able to do its work and generate a > response), but at some point after my method finishes, RESTEasy pukes > and dies with this exception. > > 10:57:00,769 WARN [org.jboss.resteasy.core.ExceptionHandler] (default > task-10) Failed executing POST /execute-ant: > org.jboss.resteasy.spi.InternalServerErrorException: Subresource for > target class has no jax-rs annotations.: > org.jboss.resteasy.specimpl.BuiltResponse > at > org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:126) > [resteasy-jaxrs-3.0.10.Final.jar:] > at > org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:103) > [resteasy-jaxrs-3.0.10.Final.jar:] > at > org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) > [resteasy-jaxrs-3.0.10.Final.jar:] > at > org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) > [resteasy-jaxrs-3.0.10.Final.jar:] > at > org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) > [resteasy-jaxrs-3.0.10.Final.jar:] > at > org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) > [resteasy-jaxrs-3.0.10.Final.jar:] > at > org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) > [resteasy-jaxrs-3.0.10.Final.jar:] > at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) > [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final] > at > io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166) > [undertow-servlet-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.server.Connectors.executeRootHandler(Connectors.java:197) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759) > [undertow-core-1.1.0.Final.jar:1.1.0.Final] > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > [rt.jar:1.8.0_45] > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > [rt.jar:1.8.0_45] > at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_45] > > Thanks in advance for any help you can offer. > > John |