服务器如何将 URI 模式绑定到特定的 Java class?

How does server binding URI pattern to a particular Java class?

下面我休息class

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 file.Do 我们需要在 Web 配置中配置...?

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

提前致谢...

有一个 class javax.ws.rs.core.Application; 您需要对其进行扩展(至少我这样做了)以便注册您的 JaxRs 资源 URI 并提供web.xml 中的相应信息,例如:-

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>

因为您的 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>

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

并且使用 /* url 模式,所有资源都将传递给 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 是如何知道我的 class 用 @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 serrvlet 会识别资源 class 或 class 方法将为请求提供服务并调用它的 URI 路径,即UserRestService 你的情况。

希望对您有所帮助:)