2

我有一个在 JBoss EAP 5 上运行的 Web 服务应用程序(使用 JAX-RS),前面有 Apache。我正在编组 XML 的类如下所示:

@XmlRootElement(name = "newRequest")
public class NewRequest {
    @XmlElement(required = false, name = "Guid")
    public String guid;
    @XmlElement(required = false, name = "AuthorizedBy")
    public String authorizedBy;
}

以及处理请求的实际代码:

@Path("/newrequest")
public class NewResource {
    private static final Logger logger = Logger.getLogger(NewResource.class);

    @PUT
    @Consumes({"application/xml", "application/json"})
    @Produces({"application/xml", "application/json"})
    public String processNewRequest(@HeaderParam("Authorization") String authorization, NewRequest request) {
        ...
    }
    ...
}

我在 Apache access_log 中看到了请求:

10.1.4.55 - qa [26/Jun/2013:13:34:16 -0500] "PUT /rest/newrequest HTTP/1.1" 400 961 "-" "Apache-HttpClient/4.2.1 (java 1.5)" 135807 961

但 JBoss 日志中没有任何内容。当我故意在我的 XML 中拼错某些内容时会产生 400 错误(使用 JMeter 发送请求;输入“nwe”而不是“new”。有什么方法可以让我捕捉到这个错误并找出哪个元素是错误的) ? 我确实读过有关 JAX-RS 异常映射器的信息,但以前从未使用过它们,并且不确定它们是否是处理此问题的正确方法。

4

1 回答 1

0

是的,您应该使用ExceptionMapper.

异常映射器很容易在 JAX-RS 中创建和配置。您所要做的就是实现javax.ws.rs.ext.ExceptionMapper<T>接口并使用注释对类进行@Provider注释。

@Provider
public class ParseExceptionMapper extends implements ExceptionMapper<{Exception Being Thrown During Parse}> 
{
    @Override
    public Response toResponse({Exception Being Thrown During Parse} exception) 
    {
         //Create a response here.
    }
}

编辑:

我假设您使用 Resteasy 作为您的 JAX-RS 实现,因为您只提到您在 JBoss 中进行部署。这并不重要,因为它BadRequestException在任何符合 JAX-RS 的实现中。

尝试为org.jboss.resteasy.spi.BadRequestException. 这是 Resteasy 在遇到 HTTP 400 错误时引发的异常。

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.spi.BadRequestException;

@Provider
public class BadRequestExceptionMapper implements ExceptionMapper<BadRequestException>
{
    @Override
    public Response toResponse(BadRequestException exception) 
    {
        //Create Response Here
    }
}
于 2013-07-05T05:10:07.033 回答