泽西岛:1.12 春季:3.11 JDK:1.6.0_35 Tomcat:6..0.33
我正在尝试为由 Spring IoC 容器在 SpringServlet 的上下文中实例化的 Jersey servlet 注册 ExceptionMapper 实例,并且在 Jersey servlet 期间遇到了旧的“组件类 X 的范围必须是单例”异常初始化。我目前无法发布实际代码,所以我将提供实现的要点,看看是否有明显的东西跳出来,或者我是否可以指出我拥有的一些文档错过了。
ExceptionMapper 实例本质上如下:
// ... package definitions omitted ...
@Provider
@Singleton
public class MyExceptionMapper
implements ExceptionMapper<MyException>
{
// ... injected attributes omitted ...
@Override
public Response toResponse(MyException exception)
{
// ... specific handling logic omitted ...
return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
}
}
applicationContext.xml 中的 bean 定义如下,默认为单例范围(并且添加显式范围说明符似乎不会改变行为):
<bean id="myExceptionMapper" class="my.package.MyExceptionMapper" />
web.xml 中的 Spring 上下文加载器侦听器和 SpringServlet 配置本质上是样板文件,当 MyExceptionMapper 的 bean 定义从 applicationContext.xml 注释掉时,servlet 将加载、初始化和正确操作其他注入属性。但是,当 applicationContext.xml 中存在 bean 定义时,我会收到以下日志消息:
SpringProviderFactory - Registering Spring bean, myExpectionMapper, of type my.package.MyExceptionMapper as a provider class
SpringProviderFactory - Registering Spring bean, myServiceController, of type my.package.MyServiceController as a root resource class
... other root resource classes loading ...
SpringServlet - Exception occurred when initialization
java.lang.RuntimeException: The scope of the component class my.package.MyExceptionMapper must be a singleton
at som.sun.jersey.core.spi.component.ioc.IoCProviderFactory.wrap(...)
我尝试将 MyExceptionMapper 放在扫描包层次结构中,以便在初始化期间由 SpringServlet 拾取,并放在单独的包层次结构中,结果不会改变。
对此的任何帮助或指导将不胜感激。