【问题标题】:demo jax-rs resource not bound where expected on jboss演示 jax-rs 资源未绑定到 jboss 上的预期位置
【发布时间】:2013-05-14 07:03:03
【问题描述】:

我正在尝试制作一个小型 jax-rs 演示。

我有这个资源类:

@Path("/cart")
public class ShoppingCartResource {

    @EJB
    private ShoppingCartService shoppingCartService;

    @GET
    public String getCart() {
        ShoppingCart cart = shoppingCartService.getCart();
        return "cart with "+cart.getProducts().size()+" items";
    }
}

这个类被打包在一个名为 rest-1.0-SNAPSHOT.war 的 *.war 中,它本身在一个名为 ear-1.0-SNAPSHOT.ear 的 *.ear 中,我放置在 jboss 7.1.3 的 /deployments 目录中

我的 web.xml 是空的:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
</web-app>

我的 application.xml(在耳朵里)是由 maven 自动生成的:

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
  <display-name>ear</display-name>
  <module>
    <ejb>services-impl-1.0-SNAPSHOT.jar</ejb>
  </module>
  <module>
    <web>
      <web-uri>rest-1.0-SNAPSHOT.war</web-uri>
      <context-root>/rest</context-root>
    </web>
  </module>
  <library-directory>lib</library-directory>
</application>

当我启动 jboss 时,它开始了我的战争,从日志中可以看出:

09:52:19,392 INFO  [org.jboss.web] (MSC service thread 1-4) JBAS018210: Registering web context: /rest
09:52:19,401 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 28) JBAS018559: Deployed "ear-1.0-SNAPSHOT.ear"

但无论我尝试什么 url,我都无法访问此资源。 我试过了:

  1. localhost:8080/rest/cart
  2. localhost:8080/ear-1.0-SNAPSHOT/rest/cart

我不断收到 404。 资源绑定在哪里,或者如果它没有真正绑定,我做错了什么?

【问题讨论】:

    标签: java jakarta-ee jboss jax-rs


    【解决方案1】:

    显然有一种合法(符合规范)的方式来部署 jax-rs 资源而无需 servlet/filter 映射,如 jax-rs 文档here 中所述(该部分说 as7,但它实际上适用于任何 Java EE 6 兼容 AS)。

    解决方案是有一个空的 web.xml,然后包含一个用 @ApplicationPath 注释的 Application 类:

    @ApplicationPath("/root-path")
    public class MyApplication extends Application
    {
    }
    

    【讨论】:

      【解决方案2】:

      JAX-RS 应用程序需要 web.xml 中的配置部分来正确设置管理休息调用的 servlet。 在您的 web.xml 中创建一个部分,如下所示:

      <servlet>
          <servlet-name>JerseyRestService</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>...</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>JerseyRestService</servlet-name>
          <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
      

      servlet 部分中的 init 参数应包括包含其余类的包。 url-pattern 参数可以更改为您喜欢的 url 前缀。

      【讨论】:

      • 没有与实现无关的方法吗?我真的不喜欢依赖球衣或休息的想法
      • 经过一番挖掘,我发现了一个 - @ApplicationPath 在你的应用程序类 + 空 web.xml
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      相关资源
      最近更新 更多