5

我使用泽西 + 春天。我有实现 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);
    }

}

}

4

1 回答 1

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.

您可以从以下位置检索 Jersey 资源中的属性HttpContext

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

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

于 2013-09-18T15:26:03.707 回答