繁体   English   中英

如何拦截Apache CXF Servlet异常

[英]How to intercept Apache CXF Servlet exceptions

我使用Apache CXF开发了一个REST服务,并注意到如果我在URL中发送无效字符,CXF servlet会在它到达我的代码之前抛出以下异常:

Servlet failed with Exception
java.lang.IllegalArgumentException
at java.net.URI.create(URI.java:841)
at org.apache.cxf.transport.servlet.BaseUrlHelper.getBaseURL(BaseUrlHelper.java:49)
at org.apache.cxf.transport.servlet.ServletController.getBaseURL(ServletController.java:73)
at org.apache.cxf.transport.servlet.ServletController.updateDestination(ServletController.java:82)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:162)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:239)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:164)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:215)

这导致将500状态代码返回给客户端。

理想情况下,我希望拦截此异常并向客户端返回400 Bad Request状态代码,但我无法确定如何执行此操作。

任何帮助非常感谢!

非常感谢

我这样做的方式是通过拦截器。 如果在初始处理请求期间发生错误,则框架响应(当然还有状态代码)将放在消息管道上。 因此,您可以在“marshall”阶段编写拦截器,检查是否已有响应并重写您自己的响应。

@Override
public void handleMessage(Message message) throws Fault {

    if (message.getExchange().get(Response.class) != null) {
         //build your response and put it on the exchange
         message.getExchange().put(Response.class, yourResponse);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM