【问题标题】:How can I configure the JAX-RS base path in TomEE+?如何在 TomEE+ 中配置 JAX-RS 基本路径?
【发布时间】:2013-07-19 06:55:36
【问题描述】:

我有一个包含一些 JAX-RS 服务的 WAR,部署到 TomEE Plus 中。给定带有@Path("myservice") 注释的服务,TomEE+ 将其发布到localhost:8080/mywebapp/myservice

然而,这也使得访问 localhost:8080/mywebapp/index.jsp 的 JSP 成为不可能 - JAXRSInInterceptor 抱怨 No root resource matching request path has been found, Relative Path: /index.jsp

所以我想为所有服务配置一个路径前缀api,这会将myservice URL 更改为localhost:8080/mywebapp/api/myservice。如果我自己配置​​了 CXF(有或没有 Spring),这样做将是微不足道的,因为我可以简单地更改 CXF Servlet 的 URL 模式 - 但我依赖于默认设置,除了注释。那么在这种情况下我该怎么做呢?

请注意,我不想更改 @Path 注释以包含前缀,因为这不能解决 JSP 的问题。

【问题讨论】:

    标签: cxf jax-rs apache-tomee


    【解决方案1】:

    创建javax.ws.rs.core.Application 的扩展并使用@ApplicationPath 对其进行注释,在您的情况下,值将是api

    @ApplicationPath("/api")
    public class MyApplication extends Application {
    
        @Override
        public Set<Class<?>> getClasses() {
            final Set<Class<?>> classes = new HashSet<Class<?>>();
            // register root resource
            classes.add(MyServiceResource.class);
            return classes;
        }
    }
    

    这样,Servlet 3 容器会找到您的应用程序并将您的资源映射到 /mywebapp/api/myservice,同时使您的 Web 资源 (.jsp) 在 /mywebapp 可用。

    【讨论】:

    • 好的,可以,谢谢!但是,我更喜欢一种不会强迫我实现getClasses() 方法的方法。当我没有Application 类时,会自动检测我的资源,但是当我有一个并且不覆盖getClasses() 时,不会设置任何资源:-(
    • 如果他们正在处理这样的情况,我建议看看 CXF 专有 API(Jersey 确实如此,请参阅 ResourceConfig#packages,所以这并不少见)。
    【解决方案2】:

    TomEE trunk 支持以下配置:cxf.jaxrs.staticSubresourceResolution & cxf.jaxrs.static-resources-list

    但@ApplicationPath 是更相关的解决方案 IMO

    在某些情况下,使用 -Dopenejb.webservice.old-deployment=true 也会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2017-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多