我有
@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>
我正在
严重:冲突的URI模板。 URI模板/用于root 资源类service.Adages和URI模板/转换为 相同的正则表达式(/.*)?
为什么我有两个不同的ApplicationPath,这个例外是在启动时出现的?
如果我在param-value中取出一个包有效,那么如果我更改了其中一个@Path注释,那么这对我的配置有问题吗?
我使用泽西岛1.10。谢谢大家。
答案 0 :(得分:6)
您没有在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检查了上面的代码,它可以工作。如果仍然有这个bug,请尝试升级到Jersey 1.17(不应该改变Jersey 1.10的任何行为,而是修改bug)并最终使用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>
在泽西岛旧版本的规范中似乎存在错误,这种错误会将引用圈回并标记为重复的端点。使用上面的配置加载两个端点没有任何问题。
8/04/2014 09:13:40 PM com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer addServletWithApplication INFO:注册Jersey servlet 应用程序名为com.koitoer.webservices.chapter2.service2.RestfulPrediction,位于 servlet映射, / resourcesP / * ,与Application类相同 名称
8/04/2014 09:13:40 PM com.sun.jersey.server.impl.container.servlet.JerseyServletContainerInitializer addServletWithApplication INFO:注册Jersey servlet 应用程序,名为com.koitoer.webservices.chapter2.RestfulAdage,at servlet映射, / resourcesA / * ,与Application类的 同名
答案 1 :(得分:-1)
您的网络应用中应该有javax.ws.rs.core.Application
的单个子类,然后在@Path
和service.Adages
资源类型上使用不同的webservices.PredictionsRS
注释值。
AFAIK,在JEE6容器中,不允许有2个这样的子类...