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 拦截了,像这样:
http://localhost:8080/
---> 它用 RestVersion.version() json 正确回答
http://localhost:8080/asd
---> 它总是被 RestVersion 拦截,但我想在另一个 class 上管理它,它上面有一个 @Path("/asd")
(但在这一刻我不能用这个配置)
如何在不影响所有其他路径的情况下仅拦截项目根目录?
在 class 级别添加 @Path("/")
。在您要管理的其他 classes 中,添加他们特定的 @Path("/asd")
.
末尾是所有层次结构,从 @ApplocationPath
开始,接着是 class 级别的 @Path
,最后是方法级别的 @Path
。
结合这些,您应该能够应对任何情况。
如果在没有 @Path
的方法中找到 @GET
,将管理 class 级别注释的 @Path
的 GET
请求。
更新: 添加示例
因此,为了简化而避免接口(尽管我只在必要时使用它们),你应该用这 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 {
}
我有这个 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 拦截了,像这样:
http://localhost:8080/
---> 它用 RestVersion.version() json 正确回答
http://localhost:8080/asd
---> 它总是被 RestVersion 拦截,但我想在另一个 class 上管理它,它上面有一个@Path("/asd")
(但在这一刻我不能用这个配置)
如何在不影响所有其他路径的情况下仅拦截项目根目录?
在 class 级别添加 @Path("/")
。在您要管理的其他 classes 中,添加他们特定的 @Path("/asd")
.
末尾是所有层次结构,从 @ApplocationPath
开始,接着是 class 级别的 @Path
,最后是方法级别的 @Path
。
结合这些,您应该能够应对任何情况。
如果在没有 @Path
的方法中找到 @GET
,将管理 class 级别注释的 @Path
的 GET
请求。
更新: 添加示例
因此,为了简化而避免接口(尽管我只在必要时使用它们),你应该用这 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 {
}