2

Play! を使用して REST Web サービスを実装しています。バージョン 2.0.4。

いくつかのテスト (curl を使用してリソースを要求) の後、Play! 次の Content-Type を持つ XML のみを受け入れます: text/xml。W3 によると、text/xml と application/xml の両方が有効な MIME タイプです。

出典: http://www.w3.org/TR/xhtml-media-types/

メディア タイプ 'application/xml' および 'text/xml' も使用できますが、適切な場合は常に、これらの一般的な XML メディア タイプではなく、'application/xhtml+xml' または 'text/html' を使用する必要があります。

問題。私のコードでは、次のようなものがあります。

106: if (request().getHeader("Content-Type").contains("text/xml")
107:            || request().getHeader("Content-Type").contains("application/xml")) {
108:        
109:        Document xml = request().body().asXml();
110:        Node root = XPath.selectNode("cost", xml);
        ...
}

Content-Type が text/xml と等しい場合、すべて正常に動作しますが、Content-Type が application/xml と等しい場合、他のサイトでは Play! nullフレームワークは割り当てに戻りますDocument xml = request().body().asXml();

以下は、Web サービスのテストに使用したコマンドの一覧です (curl を使用)。

$ curl -i -X POST -d @input.xml -H "Content-Type: text/xml" \
http://localhost:9000/costs

HTTP/1.1 200 OK
Content-Type: text/xml
Content-Length: 146

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><cost>3089219.0</cost>

$ curl -i -X POST -d @input.xml -H "Content-Type: application/xml" \
http://localhost:9000/costs

HTTP/1.1 500 Internal Server Error
Content-Type: text/html; charset=utf-8
Content-Length: 5231

...
[RuntimeException: java.lang.RuntimeException: java.lang.NullPointerException]
In (...)/app/controllers/Application.java at line 110.
...

これはバグですか、それとも通常の動作ですか?

ありがとう!

リカルド・F・テイシェイラ

4

1 に答える 1

1

これが意図されているかどうかについては、必ずしも答えられるとは限りませんが、同じ問題に遭遇し、この状況の回避策を管理していました.

を受け取るとrequest().body().asRaw().asBytes()、 が返されbyte[]ます。

そこから、それ自体の構築の引数として受け入れるaByteArrayInputStreamを構築するために使用できます。Document

DocumentBuilder docBuilder = DocumentBuilderFactory().newInstance().newDocumentBuilder();
Document xml = docBuilder.parse(new ByteArrayInputStream(request().body().asRaw().asBytes()));
于 2012-11-12T17:18:00.687 に答える