2011-01-31 3 views
1

Я пытаюсь написать строку непосредственно в OutputStream внутри метода writeTo для реализации интерфейса MessageBodyWriter. Я хочу сделать это внутри блока catch try, чтобы отправить сообщение, когда поймано исключение. Однако, когда я отлаживаю программу, я понимаю, что String никогда не записывается в OutputStream (size = -1).JAXB записывается в OutputStream внутри метода writeTo

код выглядит примерно так:

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

НОВЫЙ ОТВЕТ

Вы можете использовать в WebApplicationException, что может быть выброшено из метода WriteTo в MessageBodyWriter.

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); 
    } 
} 

ОРИГИНАЛЬНЫЙ ОТВЕТ

На мой взгляд лучше бросать в JAXBException от MessageBodyWriter, а затем создавая 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

Спасибо, Блейз. Причина, по которой я не делаю этого, заключается в том, что исключение (Runtime), брошенное внутри моего класса (расширяет MessageBodyWriter), не попадает в созданный мной создатель. Я делаю это вручную, пытаясь записать сообщение об ошибке в выходной поток – denniss

+0

ExceptionMapper должен улавливать исключения Runtime. Вы всегда можете создать свой собственный класс исключений. Попросите свой MessageBodyWrtier обернуть все исключения, вызванные вашим исключением. И создайте ExceptionMapper для вашего собственного типа исключения. –

+0

Это именно то, что я сделал. Я создал свое собственное исключение и выбросил его в свой класс, например catch (JAXBException e) {throw new MyException ("HI");}. У меня также есть сопоставление для этого конкретного исключения. По какой-то причине всякий раз, когда я пытаюсь выкинуть исключение из этого класса, он не попадает в карту. Вместо этого он возвращает что-то вроде java.lang.IllegalStateException: STREAM – denniss

Смежные вопросы