我有
@ApplicationPath("/resourcesP")
public class RestfulPrediction extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(PredictionsRS.class);
return set;
}
}
和
@ApplicationPath("/resourcesA")
public class RestfulAdage extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> set = new HashSet<Class<?>>();
set.add(Adages.class);
return set;
}
}
两个不同的ApplicationPath和类如下。
@Path("/")
public class service.Adages {}
@Path("/")
public class webservices.PredictionsRS {}
它们都在不同的 ApplicationPath 中声明。我正在使用 Jersey,web.xml 中的配置看起来像
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
service
webservices
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
我得到了
SEVERE: Conflicting URI templates. The URI template / for root resource class service.Adages and the URI template / transform to the same regular expression (/.*)?
为什么如果我有两个不同的 ApplicationPath,这个异常会在启动时出现?
如果我在 param-value 中取出一个包,这是有效的,如果我更改其中一个 @Path 注释,这也是有效的,那么这是我的配置问题吗?
我正在使用 Jersey 1.10。谢谢大家。
最佳答案
您没有在 web.xml
中定义 JAX-RS 应用程序。尝试以下操作:
<servlet>
<servlet-name>full.name.RestfulAdage</servlet-name>
</servlet>
<servlet>
<servlet-name>full.name.RestfulPrediction</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>full.name.RestfulPrediction</servlet-name>
<url-pattern>/resourcesP/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>full.name.RestfulPrediction</servlet-name>
<url-pattern>/resourcesA/*</url-pattern>
</servlet-mapping>
并从代码中删除 @ApplicationPAth
注释。
我用 Jersey 2.7、servlet 容器 3.0 检查了上面的代码,它可以工作。如果仍然存在该错误,请尝试升级到 Jersey 1.17(这不应更改 Jersey 1.10 的任何行为,而是修复错误)并最终使用 servlet 容器 3.0。
更新
在检查了以下配置与 Jersey 1.17 一起工作的可能性之后
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>
com.koitoer.webservices
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
似乎旧版本 Jersey 的规范中存在错误,这种错误会返回引用并标记为重复端点。使用上面的配置,两个端点加载没有任何问题。
8/04/2014 09:13:40 PM com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer addServletWithApplication INFO: Registering the Jersey servlet application, named com.koitoer.webservices.chapter2.service2.RestfulPrediction, at the servlet mapping, /resourcesP/*, with the Application class of the same name
8/04/2014 09:13:40 PM com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer addServletWithApplication INFO: Registering the Jersey servlet application, named com.koitoer.webservices.chapter2.RestfulAdage, at the servlet mapping, /resourcesA/*, with the Application class of the same name
关于java - 同一 WAR 中的多个 JAX-RS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929499/