我有一个要求,我需要读取作为请求的一部分进入的JSON请求,并同时将其转换为POJO。我能够将其转换为POJO对象。 但是我无法获得请求的请求主体(有效负载)。
对于Ex: Rest Resource将如下
@Path("/portal")
public class WebContentRestResource {
@POST
@Path("/authenticate")
@Consumes(MediaType.APPLICATION_JSON)
public Response doLogin(UserVO userVO) {
// DO login
// Return resposne
return "DONE";
}
}
POJO
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class UserVO {
@XmlElement(name = "name")
private String username;
@XmlElement(name = "pass")
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
JSON请求
{
"name" : "name123",
"pass" : "pass123"
}
能够在WebContentRestResource的doLogin()方法中正确填充UserVO。 但我还需要作为请求的一部分提交的Raw JSON。
任何人都可以帮助我吗?
由于 〜阿肖克
答案 0 :(得分:13)
以下是Jersey 2.0的一个示例,以防有人需要它(受到futuretelematics的启发)。 它拦截JSON甚至允许更改它。
@Provider
public class MyFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext request) {
if (isJson(request)) {
try {
String json = IOUtils.toString(req.getEntityStream(), Charsets.UTF_8);
// do whatever you need with json
// replace input stream for Jersey as we've already read it
InputStream in = IOUtils.toInputStream(json);
request.setEntityStream(in);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
boolean isJson(ContainerRequestContext request) {
// define rules when to read body
return request.getMediaType().toString().contains("application/json");
}
}
答案 1 :(得分:-2)
一个可能性是使用 ContainerRequestFilter ,在调用方法之前调用:
public class MyRequestFilter
implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest req) {
// ... get the JSON payload here
return req;
}
}