2014-12-10 1 views
2

У меня есть следующий отдых сервис:@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. Но решение все равно требуется.

+0

Вам нужно убедиться, что ваш SomeEntity действительно сериализуется JSON (скажем, через JAXB impl) –

+0

Не могли бы вы указать свой комментарий? Нужно ли добавлять аннотации к моему объекту? – Everv0id

+0

Я знаю, что вы используете resteasy, но идеи от https://jersey.java.net/documentation/1.18/json.html также применимы, вам нужно использовать json из тела запроса и сериализовать его на объект объекта, большую часть JAX-RS impl использует JAXB magic, поэтому –

ответ

1

У меня была такая же ошибка с использованием REST-клиента из IDEA IDE, я пропустил, чтобы добавить правильный тип Content-Type: application/json в запрос, а затем RESTeasy может перевести java.util.LinkedHashMap как мой объект в методе POST.

Надеюсь, что это поможет или может дать некоторый намек для вашего расследования.

+0

Спасибо за ответ! Я тоже использовал плагин IDEA REST, но я установил 'Accept: application/json' в параметре запроса, поэтому я думаю, что это не проблема. Надеюсь, я правильно понял ваш ответ. – Everv0id

+0

Параметр Accept используется для ответа, но если вы отправляете POST, я думаю, вы также должны поместить Content-Type, чтобы идентифицировать тело. В любом случае, надеюсь, что это может дать вам какой-то намек. –

+0

Спасибо, теперь ясно. Я думал, что «Accept» - это то же самое, что и «Content-Type». Если это разные вещи, это может объяснить проблему. – Everv0id

0

Неправильный отправленный вами JSON. Вы не можете использовать = (вместо этого используйте :), а строковые значения должны быть указаны.

Воспользуйтесь инструментом, таким как JSONLint, чтобы подтвердить ваш запрос.

+0

Извините, исправил свой вопрос. Я использую ':', а не '=' и кавычки тоже. – Everv0id

+0

Вам все равно нужно указать ваши строковые значения, например. '" param1 ":" value1 "' (в вашем примере вы используете '" param1 ": value1'). – matsev

+0

сейчас разместите свой код класса SomeEntity – Jimmy

Смежные вопросы