4

私は、いくつかのカスタム HttpMessageConverters を備えたこの Spring Java 構成を持っています。

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorParameter(true).
            ignoreAcceptHeader(false).
            useJaf(true).
            defaultContentType(MediaType.TEXT_HTML).
            mediaType("html", MediaType.TEXT__HTML).
            mediaType("rdf", MediaTypes.RDFXML);
}

Jena でこの設定をクエリすると、次のエラーが表示されます。

このリクエストによって識別されたリソースは、リクエストの「accept」ヘッダーに従って受け入れられない特性を持つレスポンスのみを生成できます

Jena は、次の Accept ヘッダーを使用してリクエストを送信します。

Accept: text/turtle,application/n-triples;q=0.9,application/rdf+xml;q=0.8,application/xml;q=0.7, / ;q=0.5

私の理解ではapplication/rdf+xml、 は上記の構成によって返されるはずです。これは、最も高い値を持つタイプが構成されている限り、完全に機能します。とが利用できないapplication/rdf+xmlため、Spring が 0.8 値の にフォールバックしないのはなぜですか?text/turtleapplication/n-triples

それを有効にするオプションはありますか?

4

2 に答える 2

1

これは、さまざまな MVC ハンドラーを定義するか、content-type を検討してから何を返すかを決定することによって実現します。

異なるハンドラーの定義

@RequestMappingそのいくつかの値を指定すると、リクエストをそこに導く自動ネゴシエーションに関係なく、producesそれがヘッダーのタイプになります。Content-Type応答できる唯一のハンドラーになることで、これらのハンドラーに要求を「強制」できます。私はこれを使用してより具体的な型を返しますが、より一般的な型を返すためにも使用できると思います。

@RequestMapping(value="/sparql/service", produces={"application/rdf+xml;charset=utf-8", MediaType.ALL_VALUE})
public @ResponseBody String serviceDescriptionAsRdfXml()
{
    return null; // something here
}

@RequestMapping( value="/sparql/service", produces={"text/turtle;charset=utf-8"} )
public @ResponseBody String serviceDescriptionAsTurtle( final HttpServletRequest request )
{
    return null; // something here
}

Content-Type について考える

入ってくる型を反映し、より一般的なものを生成するには、実際にMediaTypeリクエストの一部としてオブジェクトのリストを取得し、 a を使用して結果ResponseEntityの内容を定義Content-Typeします。これにはもう少し検討が必要です。

@RequestMapping(value="/sparql/query", method=RequestMethod.GET)
public ResponseEntity<String> queryViaGet(@RequestHeader(value="Accept") final List<MediaType> contentTypes)
{
    MediaType.sortBySpecificityAndQuality(contentTypes);

    // Do some stuff to select your content type and generate your response
    final String results = null;
    final MediaType desiredType = null;

    // Create your REST response
    final HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(desiredType);
    return new ResponseEntity<String>(results, responseHeaders, HttpStatus.OK);
}
于 2014-04-23T15:44:08.000 に答える
1

ContentNegotiationConfigurer.mediaType(String,MediaType)はリクエストの解析に適用され、拡張子からメディア タイプへのマッピングを定義します - リクエストがAcceptヘッダーの形式で明示的なメディア タイプを定義していないが、リクエスト パスが指定された拡張子で終わっている場合指定されたメディア タイプが想定されます。

基本的にContentNegotiationConfigurer、リクエスト データを強化 (または変更) しますが、実際のレスポンス タイプは選択しません。

必要なのは、複数のメディア タイプを生成できるコントローラー、またはそれらの 1 つである異なるメディア タイプを生成する複数のコントローラー (または同じコントローラー内の複数のメソッド) のいずれかを生成できるコントローラーapplication/rdf+xmlです。Spring は、リクエスト内の (強化または変更された可能性のある) ヘッダーとコントローラーが実際に生成できるものとのapplication/rdf+xml間で最も一般的なメディア タイプである場合、そのコントローラーを自動的に選択します。Accept

于 2014-04-23T10:06:13.920 に答える