У меня есть следующий отдых сервис:@Consumes не работает с JSON
@Path("/add")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response add(SomeEntity entity) {
entity = someService.addEntity(entity);
return Response.ok("Entity added with id=" + entity.getId()).build();
}
После развертывания моего приложения Wildfly я отправить запрос HTTP с JSON: {"id":0,"param1":value1,"param2":value2}
и получить следующее сообщение об ошибке:
Bad arguments passed to [email protected] (java.util.LinkedHashMap {id=0, param1=value1, param2=value2})
с кодом состояния 500.
Что я могу сделать неправильно? Как заставить приложение использовать объект json вместо LinkedHashMap
?
UPDATE: код класса сущности содержит ничего интересного, только long id
и два поля String
с некоторыми аннотациями jpa.
UPDATE2: полный StackTrace:
WARN [org.jboss.resteasy.core.ExceptionHandler] (по умолчанию задача-2) Ошибка выполнения POST/отдых/добавить: org.jboss.resteasy.spi.InternalServerErrorException : Плохие аргументы переданы в [email protected] (java.util.LinkedHashMap {id = 0, param1 = value1, param2 = value2}) at org.jboss.resteasy.core.MethodInjectorImpl. invoke (MethodInjectorImpl.java:177) [resteasy-jaxrs-3.0.8.Final.jar:] на org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget (ResourceMethodInvoker.java:296) [resteasy-jaxrs-3.0.8 .Final.jar:] at org.jboss.resteasy.core.Resou rceMethodInvoker.invoke (ResourceMethodInvoker.java:250) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.core.ResourceMethodInvoker.invoke (ResourceMethodInvoker.java:237) [resteasy-jaxrs-3.0 .8.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.invoke (SynchronousDispatcher.java:356) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy. core.SynchronousDispatcher.invoke (SynchronousDispatcher.java:179) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service (ServletContainerDispatcher.java:220) [resteasy-jaxrs-3.0.8.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service (HttpServletDispatcher.java:56) [resteasy-jaxrs-3.0.8.Final.jar :] на сайте org.jboss.resteasy.plugins.server.servlet.HttpServle tDispatcher.service (HttpServletDispatcher.java:51) [resteasy-jaxrs-3.0.8.Final.jar:] в 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) [underow-servlet-1.0.15.Final.jar: 1.0. 15.Final] at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest (ServletSecurityRoleHandler.java:61) [underow-servlet-1.0.15.Final.jar: 1.0.15.Final] at io.undertow .servlet.handlers.ServletDispatchingHandler.handleRequest (ServletDispatchingHandler.java:36) [underow-servlet-1.0.15.Final.jar: 1.0.15.Final] at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest (SecurityContextAssociationHandler.java:78) at io .undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:25) [underow-core-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.servlet.handlers.security.SSLИнформацияAssociationHandler. handleRequest (SSLInformationAssociationHandler.java:113) [underow-servlet-1.0.15.Final.jar: 1.0.15.Final] в io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest (ServletAuthenticationCallHandler.java:56) [ underow-servlet-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:25) [under-core-1.0.15.Final.jar : 1.0.15.Final] at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest (AbstractConfidentialityHandler.java:45) [under-core-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest (ServletConfidentialityConstraintHandler.java:61) [ underow-servlet-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest (AuthenticationMechanismsHandler.java:58) [eng-core-1.0.15.Final.jar : 1.0.15.Final] at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest (CachedAuthenticatedSessionHandler.java:70) [eng-servlet-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.security.handlers.SecurityInitialHandler.handleRequest (SecurityInitialHandler.java:76) [underow-core-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.server.handlers.PredicateHandler .handleRequest (PredicateHandler.java:25) [under-core-1.0.15.Final.jar: 1.0.15.Final] at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest (JACCContextIdHandler.java: 61) at io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:25) [under-core-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.server.handlers .PredicateHandler.handleRequest (PredicateHandler.java:25) [underow-core-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest (ServletInitialHandler.java:240) [underow-servlet-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest (ServletInitialHandler.java:227) [подзапрос-1. jar: 1.0.15.Final] по io.undertow.servlet.handle rs.ServletInitialHandler.access $ 000 (ServletInitialHandler.java:73) [underow-servlet-1.0.15.Final.jar: 1.0.15.Final] в io.undertow.servlet.handlers.ServletInitialHandler $ 1.handleRequest (ServletInitialHandler.java : 146) [underow-servlet-1.0.15.Final.jar: 1.0.15.Final] at io.undertow.server.Connectors.executeRootHandler (Connectors.java:177) [underow-core-1.0.15.Final .jar: 1.0.15.Final] at io.undertow.server.HttpServerExchange $ 1.run (HttpServerExchange.java:727) [eng-core-1.0.15.Final.jar: 1.0.15.Final] в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145) [rt.jar: 1.7.0_45] at java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:615) [rt.jar: 1.7 .0_45] на java.lang.Thread.run (Thread.java:744) [rt.jar: 1.7.0_45] C aused by: java.lang.IllegalArgumentException: несоответствие типа аргумента at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) [rt.jar: 1.7.0_45] at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) [rt.jar: 1.7.0_45] at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) [rt.jar: 1.7.0_45] в java.lang.reflect.Method.invoke (Method.java: 606) [rt.jar: 1.7.0_45] at org.jboss.resteasy.core.MethodInjectorImpl.invoke (MethodInjectorImpl.java:137) [resteasy-jaxrs-3.0.8.Final.jar:] ... 35 больше
UPDATE3: Я не нашел никакого решения, поэтому заменил аргумент метода и @Consumes
с использованием @FormParam
s вместо json. Но решение все равно требуется.
Вам нужно убедиться, что ваш SomeEntity действительно сериализуется JSON (скажем, через JAXB impl) –
Не могли бы вы указать свой комментарий? Нужно ли добавлять аннотации к моему объекту? – Everv0id
Я знаю, что вы используете resteasy, но идеи от https://jersey.java.net/documentation/1.18/json.html также применимы, вам нужно использовать json из тела запроса и сериализовать его на объект объекта, большую часть JAX-RS impl использует JAXB magic, поэтому –