泽西全球ExceptionHandler并不起作用

时间:2014-09-18 06:43:43

标签: java exception jersey handler

我试图以这种方式创建一个全局ExceptionHandler:

@Provider
public class MyExceptionHandler implements ExceptionMapper<Exception> 
{
    @Override
    public Response toResponse(Exception exception) 
    {
        return Response.status(Status.BAD_REQUEST).entity("TEST").build();  
    }
}

为了捕获控制器中的所有异常:

@Path("/policy")
@GET
public void getPolicy(@DefaultValue("no") @QueryParam("_id") String _id) throws Exception{
        int a = Integer.parseInt("test"); // it generates NumberFormatException
}

NumberFormatException不是由MyExceptionHandler处理的。

我哪里错了?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果你使用泽西&lt; 2.5组件包扫描时可能存在错误:

  

@see:https://java.net/jira/browse/JERSEY-2175

否则,您正确错过以添加MyExceptionHandler的程序包进行组件扫描。 @Provider注释意味着,在提供商扫描阶段期间,JAX-RS运行时可以发现实施&#34; 应该,但事实上它确实做到了#34}就像我们想的那样。可能是一个错误,但我不确定。

意义:Afaig,你必须自己注册包或映射器 - 否则它现在不起作用了!

注意:我没有用servlet 3.x测试它,没有Application子类和基本web.xml @see 4.7.2.3.1。没有Application子类link

的JAX-RS应用程序

也许也很有趣:

  

Disable MBW, MBR, ExceptionMapper automatic registration via META-INF/services

  jersey-metainf-services(泽西扩展模块,通过META-INF /服务机制自动注册JAX-RS提供商(MBW / MBR / EM ))@since 2.9.x

为了完整起见
您可以使用ResourceConfig.packages(String ... packages)进行注册:

import org.glassfish.jersey.server.ResourceConfig;

public class MyResourceConfig extends ResourceConfig {

    public MyResourceConfig() {
        packages(new String[] { 
            "path.to.foo", 
            "path.to.bar"
        });
    }
}

web.xml servlet config中的替代

......对于包裹:

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>path.to.foo,path.to.bar</param-value>
</init-param>

...对于班级

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        path.to.foo.MyExceptionHandler,
        path.to.bar.FooBar
    </param-value>
</init-param>

答案 1 :(得分:0)

值得检查ExceptionMapper是否已注册为单身人士。将组件注册为单例取决于您的框架。以下是几个例子:

<强>吉斯

在您的注射器实例中 -

Guice.createInjector(new JerseyServletModule() {
    @Override
    protected void configureServlets() {
        /* ... this is where modules are installed and where
         * component dependencies are binded
         */

        bind(MyExceptionHandler.class).in(Scopes.SINGLETON);

        /* configure filters etc, omitted for brevity */
    }
}

<强>弹簧

在你的Spring配置中

<bean id="exceptionMapper" class="my.package.MyExceptionHandler" scope="singleton" />

或者使用组件扫描,将ExceptionMapper标记为@Component -

配置:

<context:component-scan base-package="my.package"/>

带注释的课程:

@Component
@Provider
public class MyExceptionHandler implements ExceptionMapper<Exception> {

}