【问题标题】:JAX-RS and Jersey - only one resource of multiple exposedJAX-RS 和 Jersey - 多个暴露的只有一个资源
【发布时间】:2011-09-19 16:37:17
【问题描述】:

我已经开始使用 JAX-RS 和 Jersey 建立一个 RESTful Web 服务,它公开两个资源:SessionResource 和 ItemResource。不幸的是,Web 服务只公开了其中一个。

详情:

  • 使用扩展 javax.ws.rs.core.Application 的类(由 Netbeans 7 自动创建)完成配置。该类不包含除 @ApplicationPath() 注释之外的任何配置信息。
  • 没有 web.xml 文件

问题:

  • 我错过了什么?
  • 拥有应用程序类是否有价值?我可以只用一个 web.xml 文件进行配置吗?
  • 有时我注意到在 IDE 中所做的更改不会发布到 apache。最可靠的方法是什么?

【问题讨论】:

    标签: web-services jersey jax-rs


    【解决方案1】:

    您可以在 web.xml 中执行此操作,然后您不需要 Application 类。

    <servlet>
      <servlet-name>JerseyStartup</servlet-name>
      <servlet-class>[fully qualified name of a class that extends ServletContainer]</servlet-class>
      <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.yourCompany</param-value>
      </init-param>
    </servlet>
    

    然后它会自动检测com.yourCompany及其子包中所有带有@Path注解的类,并将其视为资源。

    【讨论】:

    • 整个 web.xml 会是什么样子?我已经看过带有 servlet 的示例,但我无法找到适用于 Jersey 应用程序的示例(假设这是正确的术语)。
    • 我可以在 Application 类之外添加一个 web.xml 吗?如果没有,还有其他位置可以设置主文档吗?
    • 我更新了问题。然后将该 servlet 映射到特定的 URL 模式。我没有使用过 Application 类,所以我不知道你的第二个问题。
    【解决方案2】:

    多种解决方案之一是覆盖您的 JAX-RS 应用程序的 getClasses()

    @ApplicationPath("/")
    public class MyApplication extends Application
    {
        @Override
        public Set<Class<?>> getClasses()
        {
            return new HashSet<Class<?>>()
            {
                {
                    add(ResourceA.class);
                    add(ResourceB.class);
                }
            };
        }
    }
    

    据我所知,最好不要依赖资源和提供者的自动检测。如果您有多个 JAX-RS 应用程序,有时它可能会产生副作用。

    【讨论】:

      猜你喜欢
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      相关资源
      最近更新 更多