如何从泽西过滤器请求(ContainerRequestFilter)添加参数来请求

时间:2013-09-18 15:13:24

标签: java spring filter jersey jetty

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

例如:

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

}

}

1 个答案:

答案 0 :(得分:3)

请参阅说明

ContainerRequest#setProperty(String, Object)方法
  

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

所以你可以简单地致电

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

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

使用Jersey 1.17 ,相应的方法是ContainerRequest#getProperties(),它返回一个可变的Map<String, Object>,您可以将属性与ServletRequest同步。

您可以从HttpContext

中检索泽西岛资源中的属性
@Context
private HttpContext httpCtx
...
final String xml = httpCtx.getProperties().get("xml")

另请注意,请小心使用请求InputStream。如果堆栈中的某些其他组件也需要从流中读取,则它将失败。