5

ジャージ+スプリングを使用しています。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);
    }

}

}

4

1 に答える 1

3

ContainerRequest#setProperty(String, Object)述べている方法を参照してください

サーブレット コンテナでは、プロパティは ServletRequest と同期され、ServletRequest で使用可能なすべての属性を公開します。プロパティの変更は、関連する ServletRequest の一連のプロパティにも反映されます。

だからあなたは単に呼び出すことができます

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

HttpServletRequest次に、ハンドラーに を挿入し、でアクセスしHttpServletRequest#getAttribute("xml")ます。

Jersey 1.17ContainerRequest#getProperties()では、対応するメソッドはMap<String, Object>ServletRequest.

以下から、Jersey リソースのプロパティを取得できますHttpContext

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

別の注意として、慎重に request を消費してくださいInputStream。スタック内の他のコンポーネントもストリームから読み取る必要がある場合、失敗します。

于 2013-09-18T15:26:03.707 に答える