javax.ws.rs.Path 如何在不影响所有其他路径的情况下仅拦截项目根目录

javax.ws.rs.Path how to intercept just the project root without compromising all the other paths

我有这个 web.xml,不想要 url-pattern 的后缀,所以我使用 /* 模式:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

这是我要管理根请求的 RestVersion.java class:

import javax.ejb.EJB;
import javax.ws.rs.Path;

@Path("/")
public class RestVersion implements IRestVersion{
    @EJB
    private VersionBean versionBean;
    
    @Override
    public VersionInfo version() {
        return versionBean.getVersion();
    }
}

其中 IRestVersion.java 如下:

import javax.ejb.Local;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Local
public interface IRestVersion {
    @GET
    @Path("/")
    @Produces(MediaType.APPLICATION_JSON)
    public VersionInfo version();
}

问题是任何其他路径都被这个 RestVersion class 拦截了,像这样:

如何在不影响所有其他路径的情况下仅拦截项目根目录?

在 class 级别添加 @Path("/")。在您要管理的其他 classes 中,添加他们特定的 @Path("/asd").

末尾是所有层次结构,从 @ApplocationPath 开始,接着是 class 级别的 @Path,最后是方法级别的 @Path

结合这些,您应该能够应对任何情况。

如果在没有 @Path 的方法中找到 @GET,将管理 class 级别注释的 @PathGET 请求。

更新: 添加示例

因此,为了简化而避免接口(尽管我只在必要时使用它们),你应该用这 2 classes:

完成你想要的
@Path("/")
public class RestVersion {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getVersion() {
        return "1.0.0";
    }
}

@Path("/asd")
public class ASDController {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getAsd() {
        return "ASD";
    }
}

要激活 JAX-RS,您可以通过 web.xml 或简单地添加另一个 class:

@ApplicationPath("/")
public class JaxRSActivator extends Application {
}