2011-01-31 4 views
1

私は、MessageBodyWriterインターフェイスのwriteTo実装メソッド内でOutputStreamに直接Stringを書き込もうとしています。私はtry catchブロックの中で例外をキャッチしたときにメッセージを送るためにこれをやりたいしかし、私はプログラムを介してデバッグするとき、私は文字列が決してOutputStream(サイズ= -1)に書き込まれることに気づきます。JAXB writeToメソッド内でOutputStreamに書き込む

public void writeTo(final Object entityObject, final Class<?> aClass, final Type type, 
         final Annotation[] annotations, final MediaType mediaType, 
         final MultivaluedMap<String, Object> stringObjectMultivaluedMap, 
         final OutputStream outputStream) throws IOException, WebApplicationException { 
    try{ 
    throw new JAXBException("error"); 
    }catch(JAXBException j){ 
    outputStream.write("HI".getBytes()); 
    outputStream.flush(); 
    } 
+1

と不明な場合はログステートメント。ストリームをフラッシュしたり閉じるとどうなりますか? –

+0

それを指摘してくれてありがとう。私は潮紅を試みたが、まだ行っていない。 – denniss

+0

outputStreamの呼び出しで例外が生成されますか? –

答えて

1

NEW ANSWER

あなたはMessageBodyWriterのwriteToメソッドからスローすることができWebApplicationExceptionを活用できます。

のコードは次のようになります。私の意見で

public void writeTo(DataObject dataObject, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> multivaluedMap, OutputStream outputStream) throws IOException, WebApplicationException { 
    try { 
     throw new JAXBException("error"); 
    } catch(JAXBException e) { 
     Response response = Response.status(Response.Status.INTERNAL_SERVER_ERROR) 
            .entity("HI") 
            .type("text/plain") 
            .build(); 
     throw new WebApplicationException(response); 
    } 
} 

ORIGINAL ANSWER

あなたはMessageBodyWriterから持つJAXBExceptionを投げ、その後、問題をログに記録するExceptionMapperを作成するための優れている:

@Provider 
public class JAXBExceptionMapper implements ExceptionMapper<JAXBException> { 

    public Response toResponse(JAXBException e) { 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR) 
         .entity(e.getMessage()); 
         .type("text/plain").build(); 
    } 

} 

これはあなたをできるようになります問題が発生したことを示す応答コードを返します。

+0

Blaiseありがとうございます。私があなたのやり方をしていない理由は、クラス内にスローされた例外(ランタイム)(MessageBodyWriterを拡張)が私が作成したマッパーによって捕まえられないということです。私は出力ストリームにエラーメッセージを書き込もうとして手動でこれをやっています – denniss

+0

ExceptionMapperは実行時例外をキャッチできる必要があります。独自の例外クラスをいつでも作成できます。 MessageBodyWrtierは、あなたの例外と共にスローされた例外をラップします。また、独自の例外タイプのExceptionMapperを作成します。 –

+0

それはまさに私がやったことです。自分自身の例外を作成し、catch(JAXBException e){throw new MyException( "HI");}のようにクラスの中にスローします。私はまた、その特定の例外のマッパーを持っています。何らかの理由で、このクラスの内部で例外をスローしようとするたびに、マッパーによって捕捉されません。代わりに、java.lang.IllegalStateExceptionのようなものを返します。STREAM – denniss

関連する問題