我试图以这种方式创建一个全局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处理的。
我哪里错了?
谢谢!
答案 0 :(得分:1)
如果你使用泽西&lt; 2.5组件包扫描时可能存在错误:
否则,您正确错过以添加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> {
}