如何在Jersey中读取JSON请求体

时间:2013-06-27 06:34:29

标签: jersey jersey-client jersey-1.0

我有一个要求,我需要读取作为请求的一部分进入的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。

任何人都可以帮助我吗?

由于 〜阿肖克

2 个答案:

答案 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;
        }
}