在 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.


""

在你急于回答这个问题之前要注意两件重要的事情:

  1. 没有出现在 /opt/glassfish4/glassfish/domains/mydomain/logs/server.log
  2. 是的我 我确定 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。