Грешка при получаване на POST JSON в Java Jersey Resource

Имам проблеми с работата на услугата RESTful от Джърси.

Получавам следната грешка

    The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
    org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:806)
    org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:602)
    org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:399)
    com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalJAXBElementFromJSON(BaseJSONUnmarshaller.java:111)
    com.sun.jersey.json.impl.BaseJSONUnmarshaller.unmarshalFromJSON(BaseJSONUnmarshaller.java:100)
    com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider.readFrom(JSONRootElementProvider.java:129)
    com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111)
    com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:488)
    com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
    com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
    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.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:1511)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
* Closing connection #0

Услугата е:

@Path("/agents")
public class AgentService {

    @POST 
    @Consumes({MediaType.APPLICATION_JSON + ";charset=utf-8"})
    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
    public String createAgent(AgentTO input) {
        try{
//          Agent agent = input.createAgent()
//          PersistenceService.getInstance().save(agent);
            return input.getName();
        } catch (Exception se) {
            se.printStackTrace();
        }
        return null;
    }

А ето и обекта, който искам да получа:

@XmlRootElement
public class AgentTO {

    private String name;
    private String phone;

    public AgentTO(){}

    public AgentTO(String phone, String name){
        this.phone = phone;
        this.name = name;               
    }

Правя POST така:

curl -H "Content-Type: application/json" -v -X POST -d '{"phone":"123","name":"asd2"}' http://127.0.0.1:8080/project/agents

Правил съм Resources преди, които са точно като този, но това изглежда не иска да работи :P

Бихте ли ми помогнали с това?

Поздрави, Мартин


person mcarreiro    schedule 28.03.2013    source източник
comment
Сигурни ли сте, че изключението идва от там, публикувате json, но той се опитва да демаршалира XML?   -  person Sotirios Delimanolis    schedule 28.03.2013
comment
Имам друг ресурс и получавам тази грешка само когато правя POST, споменат по-горе. Опитах без заглавката CONTENT-JSON, получавам Сървърът отказа тази заявка, тъй като обектът на заявката е във формат, който не се поддържа от заявения ресурс за искания метод   -  person mcarreiro    schedule 28.03.2013
comment
Изключението org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:806), което показахте, идва от XML unmarshaller, няма смисъл за json, който публикувате.   -  person Sotirios Delimanolis    schedule 28.03.2013
comment
Казвате, че минава през друг код? Но работата е там, когато променя някоя от анотациите, например на @PUT, това ми казва, че методът не приема PUT   -  person mcarreiro    schedule 28.03.2013
comment
Оставам с впечатлението, че погрешно се опитва да анализира тялото на JSON заявката като XML, за да попълни екземпляр AgentTO.   -  person Sotirios Delimanolis    schedule 28.03.2013
comment
Има ли начин за отстраняване на грешки? Или да знам дали това се случва?   -  person mcarreiro    schedule 28.03.2013
comment
Ако сте в Eclipse, Ctrl+Shift+T, за да намерите класа SAXUnmarshaller или може би своя Jersey Servlet, посочете точка на прекъсване на входната точка за вашето приложение (напр. метод на сервлет service() или извикания метод на SAXUnmarshaller) и стартирайте в режим на отстраняване на грешки.   -  person Sotirios Delimanolis    schedule 28.03.2013


Отговори (1)


Можете да използвате Gson, за да демаркирате JSON от тялото на заявката. Моля, проверете тук.

person Octavian Ionel    schedule 13.10.2016