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.SubjectPrincipalRequestFilterGlobal Response Filters: com.foo.CORSFilter
Global Reader Interceptors:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptorGlobal Writer Interceptors:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor org.glassfish.jersey.server.internal.JsonWithPaddingInterceptorDynamic Features:
org.apache.shiro.web.jaxrs.ShiroAnnotationFilterFeature@204beb58Message 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.FileProviderMessage 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);
}