1

ファイルアップロードWebサービスを作成しました:

@SchemaValidation
@WebService(endpointInterface = "com.ws.server.ExchangeEndpoint")
public class ExchangeEndpoint {

@Override
public String uploadDocument(long residentId, String fileName, String mimeType, DataHandler data) {

    try {
        StreamingDataHandler dh = (StreamingDataHandler) data;  //it cast exception

インターフェースは次のとおりです。

@WebService
@StreamingAttachment(parseEagerly = true, memoryThreshold = 4194304L)
@MTOM
public interface ExchangeEndpoint {
    @WebMethod String uploadDocument(@XmlElement(name = "residentId",required = true) long residentId,
                                 @XmlElement(name = "fileName",required = true) String fileName,
                                 @XmlElement(name = "mimeType",required = true) String mimeType,
                                 @XmlElement(name = "data",required = true) @XmlMimeType("application/octet-stream") DataHandler data);

そして ClassCastException 例外をキャストします:

java.lang.ClassCastException: javax.activation.DataHandler cannot be cast to com.sun.xml.ws.developer.StreamingDataHandler

しかし、 @SchemaValidation アノテーションを削除すると、すべて正常に動作します!!!

では、なぜ @SchemaValidation が DataHandler オブジェクトを破損するのでしょうか?

300 MB を超える大きなファイルをアップロードしようとすると、OutOfMemoryError が発生します。

java.lang.OutOfMemoryError: Java heap space  at org.jvnet.staxex.ByteArrayOutputStreamEx.readFrom(ByteArrayOutputStreamEx.java:75) at org.jvnet.staxex.Base64Data.get(Base64Data.java:331)

また、 @SchemaValidation がなくてもすべて正常に動作します!!!

4

1 に答える 1

2

これはよく知られた問題です。スキーマ検証を行わないと、メモリの問題が発生しないように、一度に 1 つのチャンクをストリーミングするバイナリ添付ファイルとしてファイルを転送できます。スキーマ検証を追加する場合、ファイルは base64 でコーディングし、xml メッセージでインライン化する必要があります。これにより、ファイルが大きすぎる場合にメモリの問題が発生します。私が知っているすべての jaxws 実装は、このように動作します。

Web サービスにデジタル署名を追加すると、同じ理由でまったく同じ問題が発生します。

残念ながら、その問題に対する解決策はありません。

于 2014-04-22T12:04:46.520 に答える