在 Jersey 中实现不同的 URL 路径
Implementing different URL paths in Jersey
我正在尝试使用球衣做如下的事情:
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class route {
private final Logger logger = LogManager.getLogger(route.class);
private ResourceBundle errMsgs = ResourceBundle.getBundle(Master.ROUTE.getBundleName());
@GET @Path("route/{v_route}")
@Produces(MediaType.TEXT_PLAIN)
public Response response(@PathParam("v_route") String vp_route) {
String[] strings = {vp_route};
if (Misc.isEmptyNull(strings)) {
logger.error(errMsgs.getString("missingRouteID"));
throw new WebException(errMsgs.getString("missingRouteID"));
}
return Response.ok("ok",MediaType.TEXT_PLAIN).build();
}
@POST @Path("route")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response postResponse(@FormParam("v_auditid") String p_auditid,
@FormParam("v_tenant") String p_tenant){
// removed to keep short
}
然而,即使是简单的 cURL 达到基本 http://site/WebApi/route/parameter 也会产生以下结果:
"" - Error
report
HTTP
Status 404 - Not Found
type Status
report
messageNot Found
descriptionThe
requested resource is not available.
""
在你急于回答这个问题之前要注意两件重要的事情:
- 没有出现在
/opt/glassfish4/glassfish/domains/mydomain/logs/server.log
- 是的我
我确定 http://site/WebApi 是正确的前缀。我还有一个
jersey java class 在相同的前缀下工作得很好 !
在此处查看 jersey 文档的第 4.2、4.10 和 4.7.1.1 部分https://jersey.java.net/documentation/latest/deployment.html 您需要创建一个扩展的应用程序 class 并将扫描器添加到 web.xml 配置中使用带注释的球衣 class
查看我的博客示例
http://blog.vbranden.com/2015/03/creating-jersey-webservice-in-gatein.html
球衣有几种方法可以使用您的注释 class。此处的示例使用 resourceconfig 而不是 application。在 web.xml 中还有一种方法可以完全做到这一点,但应用程序和资源配置允许您更加灵活
使用扩展应用程序的示例 class
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>route</display-name>
<servlet>
<servlet-name>route</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.yourcompany.app.package.WSApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>route</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
应用扩展classWSApplication.java
package com.yourcompany.app.package;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.yourcompany.annotated.package.*;
public class WSApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(route.class);
return s;
}
}
包名当然要改成有意义的。和任何其他注释 classes 的路径只是作为新项目添加到 HashSet。
我正在尝试使用球衣做如下的事情:
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;
public class route {
private final Logger logger = LogManager.getLogger(route.class);
private ResourceBundle errMsgs = ResourceBundle.getBundle(Master.ROUTE.getBundleName());
@GET @Path("route/{v_route}")
@Produces(MediaType.TEXT_PLAIN)
public Response response(@PathParam("v_route") String vp_route) {
String[] strings = {vp_route};
if (Misc.isEmptyNull(strings)) {
logger.error(errMsgs.getString("missingRouteID"));
throw new WebException(errMsgs.getString("missingRouteID"));
}
return Response.ok("ok",MediaType.TEXT_PLAIN).build();
}
@POST @Path("route")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response postResponse(@FormParam("v_auditid") String p_auditid,
@FormParam("v_tenant") String p_tenant){
// removed to keep short
}
然而,即使是简单的 cURL 达到基本 http://site/WebApi/route/parameter 也会产生以下结果:
"" - Error report
HTTP Status 404 - Not Found
type Status report
messageNot Found
descriptionThe requested resource is not available.
""
在你急于回答这个问题之前要注意两件重要的事情:
- 没有出现在 /opt/glassfish4/glassfish/domains/mydomain/logs/server.log
- 是的我 我确定 http://site/WebApi 是正确的前缀。我还有一个 jersey java class 在相同的前缀下工作得很好 !
在此处查看 jersey 文档的第 4.2、4.10 和 4.7.1.1 部分https://jersey.java.net/documentation/latest/deployment.html 您需要创建一个扩展的应用程序 class 并将扫描器添加到 web.xml 配置中使用带注释的球衣 class
查看我的博客示例
http://blog.vbranden.com/2015/03/creating-jersey-webservice-in-gatein.html
球衣有几种方法可以使用您的注释 class。此处的示例使用 resourceconfig 而不是 application。在 web.xml 中还有一种方法可以完全做到这一点,但应用程序和资源配置允许您更加灵活
使用扩展应用程序的示例 class
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>route</display-name>
<servlet>
<servlet-name>route</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.yourcompany.app.package.WSApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>route</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
应用扩展classWSApplication.java
package com.yourcompany.app.package;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.yourcompany.annotated.package.*;
public class WSApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(route.class);
return s;
}
}
包名当然要改成有意义的。和任何其他注释 classes 的路径只是作为新项目添加到 HashSet。