同一WAR中的多个JAX-RS应用程序

时间:2014-04-08 06:43:08

标签: java rest jersey jax-rs

我有

@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。谢谢大家。

2 个答案:

答案 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 / * ,与A​​pplication类相同   名称

     

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 / * ,与A​​pplication类的   同名

答案 1 :(得分:-1)

您的网络应用中应该有javax.ws.rs.core.Application的单个子类,然后在@Pathservice.Adages资源类型上使用不同的webservices.PredictionsRS注释值。 AFAIK,在JEE6容器中,不允许有2个这样的子类...