2

私は saaj を使用して、Java サーブレット (apache と tomcat でホストされている) で添付ファイルを取得しています。

呼び出しを試みる場合message.getAttachments();(メッセージは SOAPMessage オブジェクト):

  • 添付ファイルが小さい場合 (数 KB) - 動作します

  • 添付ファイルが大きい場合 (数 MB)、次の例外がスローされます。

     java.lang.RuntimeException: org.jvnet.mimepull.MIMEParsingException: java.io.IOException: The system cannot find the path specified
        at com.sun.xml.messaging.saaj.soap.MessageImpl.getAttachments(MessageImpl.java:826)
        at MyCode.MyServlet.doPost(MyServlet.java:215)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
        at java.lang.Thread.run(Unknown Source)
    Caused by: org.jvnet.mimepull.MIMEParsingException: java.io.IOException: The system cannot find the path specified
        at org.jvnet.mimepull.MemoryData.createNext(MemoryData.java:93)
        at org.jvnet.mimepull.Chunk.createNext(Chunk.java:59)
        at org.jvnet.mimepull.DataHead.addBody(DataHead.java:82)
        at org.jvnet.mimepull.MIMEPart.addBody(MIMEPart.java:192)
        at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:235)
        at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:176)
        at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:101)
        at com.sun.xml.messaging.saaj.packaging.mime.internet.MimePullMultipart.parseAll(MimePullMultipart.java:118)
        at com.sun.xml.messaging.saaj.packaging.mime.internet.MimePullMultipart.parse(MimePullMultipart.java:129)
        at com.sun.xml.messaging.saaj.packaging.mime.internet.MimeMultipart.getCount(MimeMultipart.java:199)
        at com.sun.xml.messaging.saaj.soap.MessageImpl.initializeAllAttachments(MessageImpl.java:1384)
        at com.sun.xml.messaging.saaj.soap.MessageImpl.getAttachments(MessageImpl.java:824)
        ... 22 more
    Caused by: java.io.IOException: The system cannot find the path specified
        at java.io.WinNTFileSystem.createFileExclusively(Native Method)
        at java.io.File.createTempFile(Unknown Source)
        at java.io.File.createTempFile(Unknown Source)
        at org.jvnet.mimepull.MemoryData.createNext(MemoryData.java:87)
        ... 33 more
    

この問題を解決するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

2

例外を生成する MimePull のソースコードは、次のように述べています。

if (!config.isOnlyMemory() && dataHead.inMemory >= config.memoryThreshold) {
         try {
             String prefix = config.getTempFilePrefix();
             String suffix = config.getTempFileSuffix();
             File dir = config.getTempDir();
             File tempFile = (dir == null)
                     ? File.createTempFile(prefix, suffix) // here your code crashes
                     : File.createTempFile(prefix, suffix, dir);
             LOGGER.fine("Created temp file = "+tempFile);
             dataHead.dataFile = new DataFile(tempFile);
         } catch(IOException ioe) {
             throw new MIMEParsingException(ioe);
         }

メモリ サイズのしきい値を超えているため、一時ファイルを開こうとします。
いわゆる

at MyCode.MyServlet.doPost(MyServlet.java:215)

SAAJ を使用してメッセージを受信し、MimePull プラグインを有効にしているようです (-Dsaaj.use.mimepull=trueフラグを使用)。MimePull 実装は一時ファイルをフォールバックとして使用するため、より大きなファイルを受信できるようにする必要があります。

悪いニュースは、SAAJ 構成を介して MimePull リーダーを構成できないことです。File.createTempFile(...)良いニュースは、システム プロパティを介してのロジックを微調整できることですjava.io.tmpdir

から始めてみてください-Djava.io.tmpdir=/path/to/tmpdirそれ以外の場合は、 MimePull

を使用 してメッセージを直接消費してみてください。;-)

編集:または、添付ファイルがすべてのメモリを吸収することが予想されない場合は
、設定して MimePull を完全にオフにします。-Dsaaj.use.mimepull=false

于 2012-12-20T13:42:50.380 に答える
0

Jersey-Libs のバージョンを 1.13 から 1.19 に変更するだけで問題を解決しました。1.13 にはバグがあるようです。

于 2015-06-08T06:29:03.747 に答える