Jersey 2 InjectLink被忽略

时间:2015-08-31 02:49:37

标签: json maven jackson jersey-2.0 hateoas

我正在创建一个新的Jersey 2.21,Jackson 2.6.1 REST服务器(我也尝试过使用Jersey 2.19和Jackson 2.5.3)并希望使用@InjectLink来提供HATEOAS链接(例如&#39 ;自我')为我的来电者。最基本的应用程序(取自Jersey doc和Jersey示例应用程序)不起作用,我无法弄清楚原因。

我开始使用基本的Widgets类from the Jersey doc,但返回的JSON或XML只是一个空结构。

XML:

<Widgets/>

JSON:

{}

Widgets.java

package org.glassfish.jersey.examples.linking;

import java.net.URI;
import java.util.List;

import javax.ws.rs.core.Link;
import javax.xml.bind.annotation.XmlRootElement;

import org.glassfish.jersey.linking.InjectLink;
import org.glassfish.jersey.linking.InjectLinks;

@XmlRootElement()
public class Widgets {
    @InjectLink(resource=WidgetsResource.class)
    URI u;

    @InjectLinks({@InjectLink(resource=WidgetsResource.class, rel = "self")})
    List<Link> links;

    public Widgets() {}
}

我在资源代码中放了一个断点并检查了返回的对象。 it.links和it.u都是null。没有任何注入。

WidgetsResource.java

@Path("widgets")
public class WidgetsResource {
    @GET
    public Widgets get() {
        Widgets it = new Widgets();
        return it;
    }
}

Maven依赖项:

<dependencies>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-declarative-linking</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>2.2.4</version>
    </dependency>
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>2.2.4</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-xml-provider</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-yaml-provider</artifactId>
        <version>${jackson.version}</version>
    </dependency>
</dependencies>

<properties>
    <jersey.version>2.21</jersey.version>
    <jackson.version>2.6.1</jackson.version>
</properties>

的web.xml:

<?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"
    id="WebApp_ID" version="3.1">
    <display-name>Server</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.glassfish.jersey.examples.linking.Server</param-value>
    </init-param>
    </servlet>

    <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/v1/*</url-pattern>
    </servlet-mapping>

</web-app>

应用程序对象:

package org.glassfish.jersey.examples.linking;

import org.glassfish.jersey.linking.DeclarativeLinkingFeature;
import org.glassfish.jersey.server.ResourceConfig;

public class Server extends ResourceConfig {
    public Server() {
        packages("org.glassfish.jersey.examples.linking",
            "com.fasterxml.jackson.jaxrs")
        .register(DeclarativeLinkingFeature.class);
    }
}

似乎只是忽略了@InjectLink(s)注释。我必须有一些神奇的设置,但我已经完成了泽西岛医生所要做的一切。

我尝试使用Servlet 2.x(显示)和Servlet 3.x(使用@ApplicationPath),这没有任何区别。

你们中的一些人会从我的软件包名称中注意到我还尝试了稍微更高级,但没有更成功的Jersey声明性链接示例(https://github.com/jersey/jersey/tree/master/examples/declarative-linking)。返回了一些基本字段,但所有注入的链接都丢失或为空。

... / Server / rest / v1 / items / 1制作:

{
  "id": "1",
  "nextId": "2",
  "prevId": "0",
  "prev": true,
  "next": true
}

仅供参考 - 我正在运行Java 1.8.0_60,Eclipse Mars和Tomcat 8.0.26。没有错误,没有警告,也没有运行时消息。我完全难过了。任何人都有任何指针???

2 个答案:

答案 0 :(得分:2)

我已将以下内容添加到我的servlet配置中:

`<init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            org.glassfish.jersey.linking.DeclarativeLinkingFeature
        </param-value>
    </init-param>'

并且链接在json响应中呈现。

答案 1 :(得分:2)

有关信息,如果您不想使用web.xml配置文件,则可以这样做:

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.linking.DeclarativeLinkingFeature;
import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("rest/v1")
public class MyApp extends ResourceConfig {

    public MyApp () {
        packages("the.package.where.your.services.are.located")
            .register(DeclarativeLinkingFeature.class);
    }
}