2011-12-02 12 views
1

私はこのサービスを持ってRESTfulなWebサービス のApache CXF設定アップロードサイズ

を作るためにCXF 2.4.4を使用しています。

添付ファイルのサイズを制限したいと思います。私はthis documentationを見つけ、HTTP 500 statusを返す以外は作業を行います。

他のステータス(HTTP 413 statusのようなもの)を返す方法を知りたい、あるいはこの例外をキャッチして再投函する方法を知りたいのですが。

EDIT
私はこの

@Service("remote") 
@InInterceptors(interceptors = {"myCompany.AttachmentInInterceptor"}) 
public class RemoteImpl implements Remote { 
    ... 
} 

とインターセプタのように、インターセプタを介してこれを行うには、管理:

public class AttachmentInInterceptor extends AbstractPhaseInterceptor<Message> { 

    public AttachmentInInterceptor() { 
     super(Phase.RECEIVE); 
    } 

    public void handleMessage(Message message) { 
     String contentType = (String) message.get(Message.CONTENT_TYPE); 
     Map<String, List<String>> headers; 

     if (contentType != null && contentType.toLowerCase().indexOf("multipart/form-data") >= 0) { 
      AttachmentDeserializer ad = new AttachmentDeserializer(message); 

      headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS); 
      String len = headers.get("Content-Length").toString(); 
      len = len.replaceAll("\\[", ""); 
      len = len.replaceAll("\\]", ""); 

      Long length = Long.valueOf(len); 
      if (length > 100000000) { 
       throw new Fault(new CustomException("Archivo grande", ErrorCode.ERROR.getCode())); 
      } 
      try { 
       ad.initializeAttachments(); 
      } catch (IOException e) { 
       throw new Fault(e); 
      } 
     } 
    } 

    @Override 
    public void handleFault(Message message) { 
    } 
} 

が、私はまだ必要な応答(HTTP 413 statusを送信することはできません。 )

私は事前に助けていただきありがとうございます

答えて

2

CXF source codeを調べると、5003以外の結果はjavax.ws.rs.WebApplicationExceptionを投げて返されます。それはRuntimeExceptionサブクラスなので、宣言する必要はありません。レスポンスコードを取る1つの引数のコンストラクタがあります(または、Responseを実際に作成することもできます)。

+0

こんにちは、感謝を返します。私はあなたが言ったことを試みたが、私はクライアントからhttpリクエストを実行するとまだ500になる。何が間違っているのかわからない –

+0

@MHero:それは非常に奇妙です。多分、あなたはそれが動作するはずであると仮定してCXFに対するバグを起こさなければならないかもしれません(また、500への変換を引き起こしている別のフィルタを配置していないと仮定して、私は過去に同様にばかげたことをしています)... –

0

以下のコードは、あなたの答えのための413

import java.io.IOException; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.util.List; 
import java.util.Map; 

import org.apache.cxf.endpoint.Endpoint; 
import org.apache.cxf.helpers.CastUtils; 
import org.apache.cxf.message.Exchange; 
import org.apache.cxf.message.Message; 
import org.apache.cxf.message.MessageImpl; 
import org.apache.cxf.phase.AbstractPhaseInterceptor; 
import org.apache.cxf.phase.Phase; 
import org.apache.cxf.transport.Conduit; 
import org.apache.cxf.ws.addressing.EndpointReferenceType; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class AttachmentInInterceptor extends AbstractPhaseInterceptor<Message> { 

private static final Long MAX_SIZE = 2048L * 1024L; 
private static final Logger LOGGER = LoggerFactory.getLogger(BaseCxfInterceptor.class); 

public AttachmentInInterceptor() { 
    super(Phase.RECEIVE); 
} 

public void handleMessage(Message message) { 
    String contentType = (String) message.get(Message.CONTENT_TYPE); 
    if (contentType != null && contentType.toLowerCase().indexOf("multipart/form-data") >= 0) { 
     Map<String, List<String>> headers = CastUtils.cast((Map<?,?>)message.get(Message.PROTOCOL_HEADERS)); 
     String len = headers.get("Content-Length").toString(); 
     len = len.replaceAll("\\[", ""); 
     len = len.replaceAll("\\]", ""); 
     Long length = Long.valueOf(len); 
     if (length > MAX_SIZE) { 
      replyEntityTooLarge(message); 
     } 
    } 
} 

private void replyEntityTooLarge(Message message) { 
    Message outMessage = getOutMessage(message); 
    outMessage.put(Message.RESPONSE_CODE, 
      HttpURLConnection.HTTP_ENTITY_TOO_LARGE); 

    message.getInterceptorChain().abort(); 
    try { 
     getConduit(message).prepare(outMessage); 
     OutputStream os = message.getContent(OutputStream.class); 
     os.flush(); 
     os.close(); 
    } catch (IOException e) { 
     LOGGER.error("Erro no interceptor do cxf {}",e); 
     throw new RuntimeException(e); 
    } 
} 

private Message getOutMessage(Message message) { 
    Exchange exchange = message.getExchange(); 
    Message outMessage = exchange.getOutMessage(); 
    if (outMessage == null) { 
     Endpoint endpoint = exchange.get(Endpoint.class); 
     outMessage = new MessageImpl(); 
     outMessage.setExchange(exchange); 
     outMessage = endpoint.getBinding().createMessage(outMessage); 
     exchange.setOutMessage(outMessage); 
    } 
    outMessage.putAll(message); 
    return outMessage; 
} 

private Conduit getConduit(Message message) throws IOException { 
    Exchange exchange = message.getExchange(); 
    EndpointReferenceType target = 
     exchange.get(EndpointReferenceType.class); 
    Conduit conduit = 
     exchange.getDestination().getBackChannel(message, null, target); 
    exchange.setConduit(conduit); 
    return conduit; 
} 
} 
+0

これは、os.flush()で例外 "java.lang.NullPointerException:null"を与えます。 – Eduardo