简体   繁体   中英

How to send json to rest service to make Jersey to parse it as a POJO?

This is my code that makes ajax call using jquery:

$.get("/login", { token: { name:"Donald", password:"Ducktown" }} , 
     function (data) {
            console.log(data);
 });

This is my POJO:

public class Token {

    private String name;

    private String password;

    public Token() {}

    //+getters, setters, toString
}

This is my rest service:

@Path("login")
public class LoginService {
    
    private static final Logger logger = LoggerFactory.getLogger(LoginService.class);

    @GET
    @Consumes(MediaType.APPLICATION_JSON)
    public void login(Token token) {
        logger.info("Token={}", token);
    }
}

And this is output:

12:16:12.211 [qtp967677821-35] [INFO] com.foo.LoginService - Token=null

Please, say how to send json correctly to make Jersey to parse it as a POJO.

This is jersey config info, that is printed in logs when Jersey starts:

Root Resource Classes: com.foo.LoginService

Pre-match Filters:
org.apache.shiro.web.jaxrs.SubjectPrincipalRequestFilter

Global Response Filters: com.foo.CORSFilter

Global Reader Interceptors:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor

Global Writer Interceptors:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor

Dynamic Features:
org.apache.shiro.web.jaxrs.ShiroAnnotationFilterFeature@204beb58

Message Body Readers:
org.glassfish.jersey.message.internal.RenderedImageProvider
org.glassfish.jersey.message.internal.SourceProvider$SaxSourceReader
org.glassfish.jersey.message.internal.FormProvider
org.glassfish.jersey.message.internal.SourceProvider$DomSourceReader
org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider org.glassfish.jersey.message.internal.StringMessageProvider
org.glassfish.jersey.message.internal.FormMultivaluedMapProvider
org.glassfish.jersey.message.internal.SourceProvider$StreamSourceReader org.glassfish.jersey.message.internal.InputStreamProvider
org.glassfish.jersey.message.internal.ByteArrayProvider
org.glassfish.jersey.message.internal.ReaderProvider
org.glassfish.jersey.message.internal.DataSourceProvider
org.glassfish.jersey.message.internal.BasicTypesMessageProvider
org.glassfish.jersey.message.internal.FileProvider

Message Body Writers:
org.glassfish.jersey.message.internal.RenderedImageProvider
org.glassfish.jersey.message.internal.FormProvider
org.glassfish.jersey.server.ChunkedResponseWriter
org.glassfish.jersey.server.validation.internal.ValidationErrorMessageBodyWriter org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJaxbJsonProvider org.glassfish.jersey.message.internal.StringMessageProvider
org.glassfish.jersey.message.internal.FormMultivaluedMapProvider
org.glassfish.jersey.message.internal.InputStreamProvider
org.glassfish.jersey.message.internal.SourceProvider$SourceWriter
org.glassfish.jersey.message.internal.ByteArrayProvider
org.glassfish.jersey.message.internal.ReaderProvider
org.glassfish.jersey.message.internal.DataSourceProvider
org.glassfish.jersey.message.internal.StreamingOutputProvider
org.glassfish.jersey.message.internal.BasicTypesMessageProvider
org.glassfish.jersey.message.internal.FileProvider

And these are my dependencies for Jersey. As gson parser I try to use jackson:

    <module groupId="jakarta.validation" artifactId="jakarta.validation-api" version="2.0.2"/>
    <module groupId="com.sun.activation" artifactId="jakarta.activation" version="1.2.1"/>
    <module groupId="jakarta.ws.rs" artifactId="jakarta.ws.rs-api" version="2.1.6"/>
    <module groupId="jakarta.xml.bind" artifactId="jakarta.xml.bind-api" version="2.3.2"/>
    <module groupId="com.google.code.gson" artifactId="gson" version="2.8.6"/>
    <module groupId="com.fasterxml" artifactId="classmate" version="1.5.1"/>
    <module groupId="com.sun.xml.bind" artifactId="jaxb-impl" version="2.3.2"/>
    <module groupId="javax.enterprise" artifactId="cdi-api" version="1.1"/>
    <module groupId="org.glassfish.hk2.external" artifactId="jakarta.inject" version="2.6.1"/>
    <module groupId="org.glassfish.hk2" artifactId="hk2-api" version="2.6.1"/>
    <module groupId="org.glassfish.hk2" artifactId="hk2-utils" version="2.6.1"/>
    <module groupId="org.glassfish.hk2" artifactId="hk2-locator" version="2.6.1"/>
    <module groupId="org.glassfish.hk2" artifactId="spring-bridge" version="2.6.1"/>
    <module groupId="org.glassfish.jersey.containers" artifactId="jersey-container-jetty-http" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.containers" artifactId="jersey-container-servlet-core" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.core" artifactId="jersey-server" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.core" artifactId="jersey-common" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.core" artifactId="jersey-client" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.ext" artifactId="jersey-bean-validation" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.ext.cdi" artifactId="jersey-cdi1x" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.ext.cdi" artifactId="jersey-cdi1x-servlet" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.inject" artifactId="jersey-hk2" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.ext" artifactId="jersey-spring5" version="2.30.1"/>
    <module groupId="com.sun.istack" artifactId="istack-commons-runtime" version="4.0.1"/>
    <module groupId="org.javassist" artifactId="javassist" version="3.27.0-GA"/>

    <module groupId="org.glassfish.jersey.ext" artifactId="jersey-entity-filtering" version="2.30.1"/>
    <module groupId="org.glassfish.jersey.media" artifactId="jersey-media-json-jackson" version="2.30.1"/>
    <module groupId="com.fasterxml.jackson.core" artifactId="jackson-annotations" version="2.10.2"/>
    <module groupId="com.fasterxml.jackson.core" artifactId="jackson-core" version="2.10.2"/>
    <module groupId="com.fasterxml.jackson.core" artifactId="jackson-databind" version="2.10.2"/>
    <module groupId="com.fasterxml.jackson.module" artifactId="jackson-module-jaxb-annotations" version="2.10.2"/>
    <module groupId="com.fasterxml.jackson.jaxrs" artifactId="jackson-jaxrs-json-provider" version="2.10.2"/>
    <module groupId="com.fasterxml.jackson.jaxrs" artifactId="jackson-jaxrs-base" version="2.10.2"/>

EDIT 1 When I change get to post (in javascript and in login service) I get:

13:41:00.345 [qtp967677821-38] [WARN] org.glassfish.jersey.servlet.WebComponent - A servlet request to the URI http://127.0.0.1:8080/login contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
13:41:00.359 [qtp967677821-38] [TRACE] org.glassfish.jersey.server.ServerRuntime$Responder - Starting mapping of the exception.
javax.ws.rs.NotSupportedException: HTTP 415 Unsupported Media Type
    at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.getMethodRouter(MethodSelectingRouter.java:412) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.access$000(MethodSelectingRouter.java:73) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter$4.apply(MethodSelectingRouter.java:665) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.MethodSelectingRouter.apply(MethodSelectingRouter.java:305) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:86) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:89) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:69) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:38) ~[jersey-server-2.30.1.jar:?]
    at org.glassfish.jersey.process.internal.Stages.process(Stages.java:173) ~[jersey-common-2.30.1.jar:?]
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:245) ~[jersey-server-2.30.1.jar:?]

Based on what you have, it should work with this:

$.get("/login", {name:"Donald", password:"Ducktown"} , 
     function (data) {
            console.log(data);
 });

Your POJO mapping has the fields name, password , so your JSON should only contain them:

ublic class Token {

    private String name;

    private String password;

    public Token() {}

    //+getters, setters, toString
}

When you send in { token: { name:"Donald", password:"Ducktown" }} , you are stating your Pojo should look like:

public class TokenWrapper {

    private Token token;
}


public class Token {

    private String name;

    private String password;

}

And your API endpoint should change to:

    @GET
    @Consumes(MediaType.APPLICATION_JSON)
    public void login(TokenWrapper token) {
        logger.info("Token={}", token);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM