我使用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);
}
}
}
答案 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
。如果堆栈中的某些其他组件也需要从流中读取,则它将失败。