【问题标题】:Is it possible to catch SAXParseException in JAX-RS/JAXB webservice?是否可以在 JAX-RS/JAXB 网络服务中捕获 SAXParseException?
【发布时间】:2010-08-03 20:27:19
【问题描述】:

我想检查一个 JAX-RS Web 服务请求是否包含在正文中的有效 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)

【问题讨论】:

    标签: java jaxb jax-rs saxparseexception


    【解决方案1】:

    您可以使用异常映射器。当异常抛出时会被翻译成响应码:

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

    参考:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多