Можно ли перехватить SAXParseException в веб-сервисе JAX-RS / JAXB? - PullRequest
3 голосов
/ 04 августа 2010

Я хотел бы проверить в запросе веб-службы JAX-RS, что в тело включен допустимый XML. Однако этот код:

@PUT
@Produces(MediaType.TEXT_XML)
@Consumes(MediaType.TEXT_XML)
@Path("/{objectID}")
public MyObject updateMyObject(@PathParam("objectID") String existingObjectID, JAXBElement<MyObject> object)
{
    MyObject udpatedObject = null;

    try
    {
        udpatedObject = object.getValue();
    }
    catch (Throwable ex)
    {
        throw new WebApplicationException(Response.Status.BAD_REQUEST);            
    }

    // carry one with processing
}

возвращает внутреннюю ошибку сервера 500 вместо ожидаемой ошибки 400. Есть ли способ поймать исключение?

Начало трассировки стека исключений:

Local Exception Stack: 
Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.0.1.v20100213-r6600): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: org.xml.sax.SAXParseException: Premature end of file.
at org.eclipse.persistence.exceptions.XMLMarshalException.unmarshalException(XMLMarshalException.java:92)

1 Ответ

2 голосов
/ 04 августа 2010

Вы можете использовать маппер исключений. Если выброшено исключение, в код ответа будет переведено:

import javax.persistence.NoResultException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class XMLMarshalExceptionMapper implements ExceptionMapper<XMLMarshalException> {

    public Response toResponse(XMLMarshalException exception) {
        return Response.status(Response.Status.BAD_REQUEST).build();
    }

}

См .:

...