6

サービス/ディスパッチメカニズムを使用してJAX-RSリソースをPOSTしようとしています。問題は、送信要求のContent-Typeがにロックされていることtext/xmlです。たとえば、これを他の種類のタイプに変更する方法がわかりませんapplication/xml

RESTfullWebサービスはとのみapplication/xmlを消費しapplication/jsonます。これは私が使用するコードです:

public static void main(String[] args) {
    QName qName = new QName("GREETINGS");

    Service service = Service.create(qName);
    service.addPort(qName, HTTPBinding.HTTP_BINDING, "http://localhost:8081/gf-ws-1/resources/greetings");

    // change headers of the outgoing request
    Map<String, Object> headers = new HashMap<String, Object>();
    headers.put("Content-Type", Arrays.asList(new String[] {"application/xml"}));
    headers.put("Accept", Arrays.asList(new String[] {"zoo"}));
    headers.put("foo", Arrays.asList(new String[] {"bar"}));

    Dispatch<Source> dispatch = service.createDispatch(qName, Source.class, Service.Mode.PAYLOAD);
    dispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_METHOD, "POST");
    dispatch.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headers);

    dispatch.invokeOneWay(new StreamSource(new StringReader("<?xml version='1.0' encoding='UTF-8'?><greeting><value>Hello World!</value></greeting>")));

    // get the response code: [HTTP/1.1 415 Unsupported Media Type] because of content type
    System.out.println(((Map<String, Object>) dispatch.getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS)).get(null));
}

Acceptヘッダーはに変更され、ヘッダーには値が追加されますがzoo、変更されません。フィルタを使用して、いくつかの条件に基づいて、またはfooヘッダーに基づいて変更することもできると思いますが、これは直感に反しているようです。foobarContent-TypeContent-Type

リクエストのすべてのヘッダーは次のとおりです。

POST /gf-ws-1/resources/greetings HTTP/1.1
Accept: zoo
Content-Type: text/xml
foo: bar
User-Agent: Metro/2.2.0-1 (tags/2.2.0u1-7139; 2012-06-02T10:55:19+0000) JAXWS-RI/2.2.6-2 JAXWS/2.2 svn-revision#unknown
Host: localhost:8080
Connection: keep-alive
Content-Length: 86

どんな助けでも大歓迎です。

4

1 に答える 1

1

メッセージ全体をカスタマイズする場合は、Service.Mode.PAYLOAD の代わりに Service.Mode.MESSAGE を使用する必要があります。

Content-Type はメッセージ関連のプロパティです。

于 2014-12-06T23:09:27.787 に答える