如何从ContainerRequestContext获取数据以构建DTO对象

时间:2016-11-28 10:12:44

标签: spring-boot filter jersey

我是春季和运动衫的新人。我正在尝试构建一个Filter来检查请求是否具有正确的参数。这是我要检查的json的一部分:

"request":{
        "application":"1 Android Mobile",
        "version":1
    }

数据的元素是我的VersionDTO的一部分:

public class VersionDTO {
    int version;
    String application;

    public String getApplication() {
        return application;
    }

    public void setApplication(String application) {
        this.application = application;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }

}

这是我的过滤器的代码:

    @Override
    public void filter(ContainerRequestContext requestContext) throws FilterException {

        if (isSecureURL(requestContext.getUriInfo().getPath())){}{
            try {

                versionFilterService.setVersionDTO(//here is where I want to pass the VersionDTO object with the data of the requestContext);
            } catch (ServiceException e) {
                    e.printStackTrace();
            }
        }
    }

    private boolean isSecureURL(String url) {
        return !UnSecureUrlEnum.isUnSecureUrl(url);
    }
}

我想要做的是从ContainerRequestContext获取数据并构建一个VersionDTO,以便将对象传递给我的服务。这可能吗?

谢谢你提前!

2 个答案:

答案 0 :(得分:1)

不可能在过滤器中获取实体,但是你得到了请求输入流,但是你需要注意一些事情,因为只有一次你可以流式传输它。 看看这个,它可能对你有用.. How to use Jersey interceptors to get request body

答案 1 :(得分:1)

是的,这是可能的。使用Jersey,您可以在读取之前缓冲流,从而允许再次读取流。您需要转到泽西ContainerRequest,您可以bufferEntity()然后只需readEntity来获取反序列化的对象。

@Override
public void filter(ContainerRequestContext requestContext) throws FilterException {

    ContainerRequest cr = (ContanerRequest) requestContext;
    cr.bufferEntity();
    VersionDTO dto = cr.readEntity(VersionDTO.class);
}