我有一个服务类,它扩展了javax.ws.rs.core.Application
,如下所示。它会覆盖getSingletons()
以确保资源类CommonServices只有一个实例。
@ApplicationPath("/")
public class Services extends Application {
@Override
public Set<Object> getSingletons() {
Set<Object> resources = new HashSet<>();
set.add(new CommonServices());
return set;
}
}
在我的资源课程中:
@Path("/")
public class CommonServices{
public CommonServices() {
}
...
}
我将应用程序部署到WebLogic,该WebLogic使用JAX-RS的Jersey实现。启动该应用程序后,我注意到实例化了CommonServices的两个实例,而不仅仅是一个实例(我在其构造函数中放入了调试语句)。这些实例化发生在进行任何服务调用之前。为什么要实例化CommonServices的两个实例?
下面是我的web.xml的片段,显示了JAX-RS的相关部分。我必须注释掉servlet映射部分。如果我不予置评,则在部署期间,WebLogic将抱怨Web应用程序中的url-pattern / *被映射到多个servlet。为什么?
<servlet>
<servlet-name>JAX-RS Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.xxx.xxx.xxx</param-value>
</init-param>
<init-param>
<param-name>wl-dispatch-policy</param-name>
<param-value>HighPriorityWorkManager</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--<servlet-mapping>
<servlet-name>JAX-RS Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>-->
编辑
我发现问题是由于容器两次调用了getSingletons()和getClasses()引起的。要解决此问题,我只需要在构造函数中而不是在getSingletons()中将资源添加到集合中。这样,就只能调用CommonServices的一个实例。