【问题标题】:How does server binding URI pattern to a particular Java class?服务器如何将 URI 模式绑定到特定的 Java 类?
【发布时间】:2015-09-24 23:01:05
【问题描述】:

我在下面有我的休息课。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("/users")
public class UserRestService { 
    @GET
    public Response getUser() { 
        return Response.status(200).entity("getUser is called").build(); 
    }
}

我不知道服务器如何将此 /users uri 模式与此 UserRestService.java 文件映射。我们是否需要在 web 配置中进行配置...?

我的问题:当 /users URI 模式匹配时如何调用 UserRestService.java?

在此先感谢...

【问题讨论】:

    标签: java spring rest spring-mvc jax-rs


    【解决方案1】:

    在基于REST 的架构中,一切都是资源。通过基于 HTTP 标准方法(e.g., POST, GET, PUT or DELETE) 的公共接口访问资源。它是您的 Web 应用程序的 web.xml 中提到的 org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher servlet 类,它征集了所有 JAX-RS 根资源和提供程序。

    使用/* url-pattern,所有资源都将传递给RESTeasy servlet。

    <servlet>
     <servlet-name>resteasy-servlet</servlet-name>
      <servlet-class>
       org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
      </servlet-class>
    </servlet>
    
    <servlet-mapping>
     <servlet-name>resteasy-servlet</servlet-name>
     <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

    您会想知道RESTeasy 是如何知道我用@Path 注释的课程的,所以还有另一种配置可以让RESTeasy 知道您必须在web.xml 中提及的资源,即

     <context-param>
          <param-name>resteasy.scan</param-name>
          <param-value>true</param-value>
     </context-param>
    

    因此,当请求来自 /users 时,org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher servlet 标识资源类或类方法将为请求提供服务并调用它的 URI 路径,在您的情况下为 UserRestService

    希望对你有帮助:)

    【讨论】:

      【解决方案2】:

      您需要扩展一个类javax.ws.rs.core.Application;(至少我这样做了)以注册您的 JaxRs 资源 URI 并在 web.xml 中提供相应的信息em> 喜欢:-

      public class ExtendedClass extends Application {
      
          @Override
          public Set<Class<?>> getClasses() {
              Set<Class<?>> classes = new HashSet<Class<?>>();
              classes.add(UserRestService.class);
              return classes;
          }
      }
      

      在 web.xml 中:-

          <servlet>
              <description>
              JAX-RS Tools Generated - Do not modify</description>
              <servlet-name>JAX-RS Servlet</servlet-name>
              <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
      
              <init-param>
      
      <param-name>javax.ws.rs.Application</param-name>
      
      <param-value>package.name.ExtendedClass</param-value>
      
      </init-param>
              <load-on-startup>1</load-on-startup>
      
          </servlet>
          <servlet-mapping>
              <servlet-name>JAX-RS Servlet</servlet-name>
              <url-pattern>
              /</url-pattern>
          </servlet-mapping>
      

      【讨论】:

        【解决方案3】:

        因为您的 jax-ws servlet 设置为响应应用程序中的特定 url,如下所示

        <servlet>
                    <servlet-name>jaxws-servlet</servlet-name>
                   <servlet-class>
                          com.sun.xml.ws.transport.http.servlet.WSSpringServlet
                    </servlet-class>
        </servlet>
        
        <servlet-mapping>
                    <servlet-name>jaxws-servlet</servlet-name>
                    <url-pattern>/hello</url-pattern>
             </servlet-mapping>
        

        【讨论】:

        • 好的,我明白了。 /hello 模式如何识别我的资源文件名(控制器)。我们是否需要在 WSSpringServlet 中提及任何内容??请澄清我...
        • 它将所有请求如localhost:8080{your applicatinon}/hello 路由到WSSpringServlet。因此您的控制器将在 url localhost:8080{your applicatinon}/hello/users 处被调用
        • @Saravanan 您需要用不同的名称注释每个控制器,例如 @Path("/department")
        猜你喜欢
        • 2023-03-04
        • 2016-05-09
        • 1970-01-01
        • 2016-03-29
        • 1970-01-01
        • 2017-09-19
        • 1970-01-01
        • 2022-06-18
        • 1970-01-01
        相关资源
        最近更新 更多