【问题标题】:How I can add parameter to request from jersey filter request (ContainerRequestFilter)如何将参数添加到来自球衣过滤器请求的请求(ContainerRequestFilter)
【发布时间】:2013-09-23 10:31:18
【问题描述】:

我使用的是 Jersey + Spring。我有实现 ContainerRequestFilter 的 Jersey 过滤器,我需要在我的 jersey 资源中传输对象。

例如:

@Provider

public class UnmarshalEntityFilter implements ContainerRequestFilter {

private static final Logger LOGGER = LoggerFactory.getLogger(UnmarshalEntityFilter.class);

@Override
public ContainerRequest filter(ContainerRequest containerRequest) {

    final String xml = getRequestBody(containerRequest);
    // Parse this xml to Object

    // How I can add this Object to my request and get from Jersey Resource ?

    return containerRequest;
}

private String getRequestBody(ContainerRequest request) {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    InputStream in = request.getEntityInputStream();
    StringBuilder sb = new StringBuilder();
    try {
        if (in.available() > 0) {
            ReaderWriter.writeTo(in, out);

            byte[] requestEntity = out.toByteArray();
            sb.append(new String(requestEntity, "UTF-8"));
        }

        return sb.toString();
    } catch (IOException ex) {
        throw new ContainerException(ex);
    }

}

}

【问题讨论】:

    标签: java spring filter jersey jetty


    【解决方案1】:

    查看ContainerRequest#setProperty(String, Object) 方法说明

    在 Servlet 容器中,属性与 ServletRequest 并公开所有可用的属性 Servlet 请求。属性的任何修改也会反映 在关联的 ServletRequest 的属性集中。

    所以你可以简单地调用

    final String xml = getRequestBody(containerRequest);
    containerRequest.setProperty("xml", xml);
    

    然后在您的处理程序中注入HttpServletRequest 并使用HttpServletRequest#getAttribute("xml") 访问它。

    对于 Jersey 1.17,对应的方法是 ContainerRequest#getProperties(),它返回一个可变的 Map<String, Object>,您可以在其中放置与 ServletRequest 同步的属性。

    您可以从 HttpContext 检索 Jersey 资源中的属性:

    @Context
    private HttpContext httpCtx
    ...
    final String xml = httpCtx.getProperties().get("xml")
    

    另一方面,小心使用请求InputStream。如果堆栈中的其他组件也需要从流中读取,它将失败。

    【讨论】:

    • @Malahov 你穿的是哪个版本的球衣?
    • 1.17.1
    • @Malahov 我不确定这个javadoc。但是您应该能够将Map<String,Object>ContainerRequest#getProperties()put 一起放入其中,并且它将被同步。
    • 我把这个xml放到属性中:containerRequest.getProperties().put("xml", xml);但从请求(在资源中)获取空值。
    • @Malahov 过滤器真的被击中了吗?确保使用日志记录语句。否则,我的想法已经用完了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多