gpt4 book ai didi

json - Jersey 2 InjectLink 被忽略

转载 作者:行者123 更新时间:2023-12-04 15:20:51 24 4
gpt4 key购买 nike

我正在创建一个新的 Jersey 2.21、Jackson 2.6.1 REST 服务器(我也尝试过 Jersey 2.19 和 Jackson 2.5.3),并且想使用 @InjectLink 为我的调用者提供 HATEOAS 链接(如“自我”)。最基本的应用程序(取自 Jersey doc 和 Jersey 示例应用程序)不起作用,我不知道为什么。

我开始学习基本的小部件类(class) from the Jersey doc ,但返回的 JSON 或 XML 只是一个空结构。

XML:

<Widgets/>

JSON:
{}

小部件.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 都是空的。没有注入(inject)任何东西。

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>

网页.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)。返回了一些基本字段,但所有注入(inject)的链接都丢失或为空。

.../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。没有错误、警告和运行时消息。我完全被难住了。有没有人指点???

最佳答案

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

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

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

关于json - Jersey 2 InjectLink 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com