Я создаю новый сервер REST Jacks 2.6.1, Jackson 2.6.1 REST (я пробовал с Джерси 2.19 и Jackson 2.5.3) и хочу использовать @InjectLink для предоставления ссылок HATEOAS (например, «я») для моих абонентов. Самое основное приложение (взятое из приложений для doc и Джерси) не работает, и я не могу понять, почему.Джерси 2 InjectLink проигнорирован
Я начал с базового класса 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 оба являются нулевыми. Ничего не вводили.
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), и это не имело никакого значения.
Некоторые из вас заметят из моих названий пакетов, что я также попробовал несколько более продвинутый, но не более успешный, пример декларации ссылок Джерси (https://github.com/jersey/jersey/tree/master/examples/declarative-linking). Некоторые базовые поля были возвращены, но все введенные ссылки отсутствовали или были нулевыми.
.../Server/отдых/v1/предметы/1 производства:
{
"id": "1",
"nextId": "2",
"prevId": "0",
"prev": true,
"next": true
}
FYI - Я бегу Java 1.8.0_60, Eclipse Mars и Tomcat 8.0.26. Нет ошибок, предупреждений и сообщений о времени выполнения. Я полностью в тупике. У кого-нибудь есть указатели ???