![](/img/trans.png)
[英]how to send JS property Array to Jersey JAX-RS JSON based REST web service
[英]How to send json to rest service to make Jersey to parse it as a POJO?
這是我使用 jquery 調用 ajax 的代碼:
$.get("/login", { token: { name:"Donald", password:"Ducktown" }} ,
function (data) {
console.log(data);
});
這是我的 POJO:
public class Token {
private String name;
private String password;
public Token() {}
//+getters, setters, toString
}
這是我的 rest 服務:
@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);
}
}
這是 output:
12:16:12.211 [qtp967677821-35] [INFO] com.foo.LoginService - Token=null
請說明如何正確發送 json 以使 Jersey 將其解析為 POJO。
這是 jersey 配置信息,當 Jersey 啟動時打印在日志中:
根資源類:com.foo.LoginService
賽前過濾器:
org.apache.shiro.web.jaxrs.SubjectPrincipalRequestFilter全局響應過濾器:com.foo.CORSFilter
全球讀者攔截器:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor全球作家攔截器:
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor動態特性:
org.apache.shiro.web.jaxrs.ShiroAnnotationFilterFeature@204beb58消息正文讀者:
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消息正文作者:
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
這些是我對 Jersey 的依賴項。 作為 gson 解析器,我嘗試使用 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"/>
編輯 1當我更改發布時(在 javascript 和登錄服務中)我得到:
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:?]
根據您所擁有的,它應該與此一起使用:
$.get("/login", {name:"Donald", password:"Ducktown"} ,
function (data) {
console.log(data);
});
您的 POJO 映射具有字段name, password
,因此您的 JSON 應該只包含它們:
ublic class Token {
private String name;
private String password;
public Token() {}
//+getters, setters, toString
}
當您發送{ token: { name:"Donald", password:"Ducktown" }}
時,您說明您的 Pojo 應該如下所示:
public class TokenWrapper {
private Token token;
}
public class Token {
private String name;
private String password;
}
您的 API 端點應更改為:
@GET
@Consumes(MediaType.APPLICATION_JSON)
public void login(TokenWrapper token) {
logger.info("Token={}", token);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.