How to read JSON request body in Jersey

只谈情不闲聊 提交于 2019-12-04 10:48:55

问题


I have a requirement, where in i need to read JSON request that is coming in as part of the request and also convert it to POJO at the same time. I was able to convert it to POJO object. But I was not able to get the request body (payload) of the request.

For Ex: Rest Resource will be as follows

@Path("/portal")
public class WebContentRestResource {
    @POST
    @Path("/authenticate")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response doLogin(UserVO userVO) {
        // DO login
        // Return resposne
        return "DONE";
    }
}

POJO as

@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 Request is

{ 
  "name" : "name123",
  "pass" : "pass123"
}

Am able to get UserVO populated properly inside WebContentRestResource's doLogin() method. But i also need the Raw JSON that is submitted as part of the request.

Can any one help me?

Thanks ~Ashok


回答1:


Here is an example for Jersey 2.0, just in case someone needs it (inspired by futuretelematics). It intercepts JSON and even allows to change it.

@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"); 
    }

}



回答2:


One posibility is to use a ContainerRequestFilter that's called before your method is invoked:

public class MyRequestFilter 
  implements ContainerRequestFilter {
        @Override
    public ContainerRequest filter(ContainerRequest req) {
            // ... get the JSON payload here
            return req;
        }
}


来源:https://stackoverflow.com/questions/17336095/how-to-read-json-request-body-in-jersey

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!