2015-08-31 5 views
4

Я создаю новый сервер 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. Нет ошибок, предупреждений и сообщений о времени выполнения. Я полностью в тупике. У кого-нибудь есть указатели ???

ответ

2

Я добавил следующее в мой сервлет конфигурации:

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

и ссылки были оказаны в ответ JSon.

0

Для получения дополнительной информации, если вы не хотите использовать конфигурационный файл 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); 
    } 
} 
Смежные вопросы