6

私は現在Web APIを実装しています

出力 (存在する場合) は JSON になるため、すべてのクラスに予想されるメディア タイプの注釈が付けられます。

@Produces(MediaType.APPLICATION_JSON)
public class CustomerResource {
    ...
}

そうすれば、クラスは自動的にjsonに変換されます。

しかし...

Microsoft により、要求/応答タイプがtext/plainの場合、IE は CORS のみをサポートします http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-回避策.aspx

4. Only text/plain is supported for the request's Content-Type header

そのため、アプリケーションがヘッダーにtext/plainで応答するように強制する必要がありますが、それでもクラスをjson出力に投影します。追加した CORS クラスがそのヘッダーを設定していることはわかっていますが、自分で別のフィルターを追加したとしても、何らかの形でアノテーションによって再び上書きされます。

4

1 に答える 1

2

ふむ、あなたが指しているリンクは、それがリクエストにのみ当てはまると言っています。したがって、テキストプレーンのみを受け入れることができますが、自由に作成できます。

編集それと同様のコードでカスタムresponsefilterを登録してみてください(多分あなたはすでにそれをしましたか?):

@Provider
public class HeaderRewriteFilter implements ContainerResponseFilter {
   @Override
   public ContainerResponse filter(ContainerRequest request, ContainerResponse response)  {
     response.setResponse(Response
                .fromResponse(response.getResponse()).header(HttpHeaders.CONTENT_TYPE, "text/plain").build());
             return response;
  }
}

ただし、結果をチェックして、応答にすでにこのヘッダーが含まれている場合は問題がないことを確認してください。それ以外の場合は、現在の応答を変更することができますが、不変オブジェクトである可能性があるため、変更できるかどうかはわかりません。ちなみに、私にはあまりきれいに見えません:)

List<Object> contentTypes = response.getHttpHeaders().get(HttpHeaders.CONTENT_TYPE);
contentTypes.clear();
contentTypes.add("text/plain");

また、json <> java databidingを実行するために、Gensonライブラリhttp://code.google.com/p/genson/を確認できます。これは、Jerseyとうまく統合されています。jarをクラスパスにドロップして実行するだけです。

編集2OK、それからあなたは他の方法でそれをしなければなりません、使用は「テキスト/プレーン」を生成し、そのタイプのためにjsonボディライターを定義します。欠点は、jsonしか生成できないことです。Gensonを使用すると、そのように行うことができます。

@Provider
@Produces({ MediaType.TEXT_PLAIN })
public class PlainTextJsonConverter extends GensonJsonConverter {
    public GensonJsonConverter() {
       super();
    }

    public GensonJsonConverter(@javax.ws.rs.core.Context Providers providers) {
       super(providers);
    }
}
于 2012-11-20T16:44:08.953 に答える