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

标签 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>  

我得到了

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/

相关文章:

java - NotificationCompat.Builder 中的 setLargeIcon() 不起作用

java - 使用 matlab 中的 java 类时主文件夹发生变化

java - 使用 JAXB 并跳过一个元素

c# - 休息服务保障

javascript - 通过 Javascript 调用 Sabre Dev Studio API

java - ReSTLet 路由噩梦?

java - Jersey Logging 过滤器为 POST 吃掉 UserPrincipal

java - Jersey Rest Web 服务重定向到同一页面

java - 在 Jersey 中使用 XML 文件进行发布时出现 SAXParseException

java - 如何将终端输出(和输入)复制到java中的文件