在 JAX-RS 中,整个 JSON 字符串被发布
In JAX-RS, entire JSON string is being posted
我有一个简单的 Jersey POST 方法接受 JSON。我正在使用 SOAP UI 进行测试,使用 POST 和媒体类型 application/JSON。
在请求正文中,我有 JSON:
{
email:"test"
}
当我对此进行测试时,我希望作为测试进入服务的字符串实际上作为整个 JSON 字符串进入。不确定这里出了什么问题,它应该根据文档工作。
@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(String email){
// email = "{
// email:"test"
// }"
return Response.ok().build();
}
如果您使用的是 Jersey 1.x,那么要接收您的 Json 作为对象,您需要声明 POJO 并用 javax.xml.bind.annotation.XmlRootElement
:
注释
@XmlRootElement
public class EmailTest{
String email;
public String getEmail(){
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
然后你必须在你的控制器中使用这个class:
@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(Email email){
System.out.println(email.getEmail()); // prints "test"
return Response.ok().build();
}
最后,您必须将 com.sun.jersey.config.property.packages
添加为您的 servlet 的 <init-param>
,添加一个或多个包(由 ,
分隔)指向您的控制器包。例如在你的 web.xml
:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.app.controllers</param-value>
</init-param>
你需要一颗豆子
public class Email{
private String email;
//getters&setters
}
public Response testJaxRs(Email emailBean){
注意解码需要添加依赖json。例如 Jackson 并将此映射添加到 web.xml
> 中的 jersey servlet> 请在此处查看完整示例:https://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
<web-app ...>
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.yourpackage</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
如果您不想将其反序列化为 bean,那么您可以接受 post 主体作为 key-value 对的映射。例如:
public Response testJaxRs(Map<String, String> body) {
body.get("email") // "test"
...
我有一个简单的 Jersey POST 方法接受 JSON。我正在使用 SOAP UI 进行测试,使用 POST 和媒体类型 application/JSON。 在请求正文中,我有 JSON:
{
email:"test"
}
当我对此进行测试时,我希望作为测试进入服务的字符串实际上作为整个 JSON 字符串进入。不确定这里出了什么问题,它应该根据文档工作。
@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(String email){
// email = "{
// email:"test"
// }"
return Response.ok().build();
}
如果您使用的是 Jersey 1.x,那么要接收您的 Json 作为对象,您需要声明 POJO 并用 javax.xml.bind.annotation.XmlRootElement
:
@XmlRootElement
public class EmailTest{
String email;
public String getEmail(){
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
然后你必须在你的控制器中使用这个class:
@POST
@Path("/TEST")
@Consumes(MediaType.APPLICATION_JSON)
public Response testJaxRs(Email email){
System.out.println(email.getEmail()); // prints "test"
return Response.ok().build();
}
最后,您必须将 com.sun.jersey.config.property.packages
添加为您的 servlet 的 <init-param>
,添加一个或多个包(由 ,
分隔)指向您的控制器包。例如在你的 web.xml
:
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.app.controllers</param-value>
</init-param>
你需要一颗豆子
public class Email{
private String email;
//getters&setters
}
public Response testJaxRs(Email emailBean){
注意解码需要添加依赖json。例如 Jackson 并将此映射添加到 web.xml
> 中的 jersey servlet> 请在此处查看完整示例:https://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
<web-app ...>
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.yourpackage</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
如果您不想将其反序列化为 bean,那么您可以接受 post 主体作为 key-value 对的映射。例如:
public Response testJaxRs(Map<String, String> body) {
body.get("email") // "test"
...