JAXB запись в OutputStream внутри метода writeTo - PullRequest
1 голос
/ 31 января 2011

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

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

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 Ответ

1 голос
/ 31 января 2011

НОВЫЙ ОТВЕТ

Вы можете использовать исключение 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();
    }

}

Это позволит вам вернуть код ответа, который указывает на возникшую проблему.

...