当前位置: 首页 > 知识库问答 >
问题:

检索JAX-RS Jersey Jackson的结果

吴缪文
2023-03-14

我有这个实体类

@Entity
@XmlRootElement
@Table(name="user")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_user", unique=true, nullable=false)
private String idUser;

@Column(nullable=false, length=50)
private String docnum;

@Column(nullable=false, length=50)
private String email;

@Column(nullable=false, length=50)
private String firstname;

@Column(nullable=false, length=50)
private String lastname;

@Column(nullable=false, length=45)
private String pwd;

//bi-directional many-to-many association to Transaction
@ManyToMany
@JoinTable(
    name="transaction_users"
    , joinColumns={
        @JoinColumn(name="user", nullable=false)
        }
    , inverseJoinColumns={
        @JoinColumn(name="transaction", nullable=false)
        }
    )
private List<Transaction> transactions;

public User() {
}

public String getIdUser() {
    return this.idUser;
}

public void setIdUser(String idUser) {
    this.idUser = idUser;
}

public String getDocnum() {
    return this.docnum;
}

public void setDocnum(String docnum) {
    this.docnum = docnum;
}

public String getEmail() {
    return this.email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getFirstname() {
    return this.firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return this.lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public List<Transaction> getTransactions() {
    return this.transactions;
}

public void setTransactions(List<Transaction> transactions) {
    this.transactions = transactions;
}

}

从数据库表生成。那么我有这个Rest服务

@Path("service/2.0")
public class ServiceTest {
@GET
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)

public Response getUser() {
    EntityManager entityManager = EntityManagerUtil.getEntityManager(); 
    entityManager.getTransaction().begin(); 
    Query q = entityManager.createQuery("SELECT u FROM User u");
    @SuppressWarnings("unchecked")
    List<User> listOfUser = q.getResultList();  
    System.out.print(listOfUser);
    return Response.ok(listOfUser).build();
}

我(应该)使用jackson API来处理json,但我没有使用maven。因此,我在构建路径中添加了以下内容。罐:

  • jackson-annotations-2.9.3。罐子
  • jackson-core-2.9.3。罐子
  • jackson-databind-2.9.3。罐子
  • jackson-jaxrs-base-2.9.3。罐子
  • jackson-module-jaxb-annotations-2.9.3。罐子
  • jersey-media-json-jackson-2.26。罐子
  • jackson-jaxrs-json-provider-2.9.3。震击器

然后我有一个应用程序配置。java类

package prova;
import com.fasterxml.jackson.jaxrs.json.*;
import org.glassfish.jersey.server.ResourceConfig;
import javax.ws.rs.ApplicationPath;

@ApplicationPath("rest")
public class ApplicationConfig extends ResourceConfig {
    public ApplicationConfig() {
        packages("com.fasterxml.jackson.jaxrs.json");
        packages("prova");
    }
}

当我尝试使用postman提交GET请求时,我收到一个“HTTP 500内部服务器错误”,描述如下:

"服务器遇到意外情况,无法满足请求。"

从日食控制台我可以看到

[EL Fine]: sql: 2017-12-16 17:44:54.251--ServerSession(1869059368)--
Connection(771012214)--Thread(Thread[http-nio-8080-exec-80,5,main])--
SELECT id_user, DOCNUM, EMAIL, FIRSTNAME, LASTNAME, PWD FROM user
[prova.User@3c713cb0, prova.User@49e51730, prova.User@d9ecdd7, 
prova.User@383fe468]dic 16, 2017 5:44:54 
PM org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWr
iterInterceptor aroundWriteTo
GRAVE: MessageBodyWriter not found for media type=application/json, 
type=class java.util.Vector, genericType=class java.util.Vector.

因此,我可以推断,查询执行正确,并返回一个由4个对象组成的数组(prova是我的实体管理器的名称),但我有一个严重的错误:MessageBodyWriter错误,我到底做得不正确?为什么我无法检索JSON数据?

谢谢

更新

根据建议,我已将GET资源修改为

@GET
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getUser() {

    return String.valueOf(10+4);

}

提交GET请求会得到邮递员“14”期望的JSON答案。。。。

问题是否可能是将列表转换为Json?如果是,怎么办?

谢谢

更新2

我以这种方式编辑了REST资源的代码:

@GET
@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String getUser() {
    EntityManager entityManager = EntityManagerUtil.getEntityManager();
    entityManager.getTransaction().begin();
    Query q = entityManager.createQuery("SELECT u FROM User u");    
    List<User> listOfUser = q.getResultList();      
    System.out.print(listOfUser);

    if (listOfUser.isEmpty()) {
        System.out.println("VOID LIST");    
        entityManager.close();
        return String.valueOf(2);
    }
    for (User user : listOfUser) {
        System.out.println(user.getFirstname());
        System.out.println("---");         
    }
    return String.valueOf(3);
    }

邮递员输出为“3”,因此,控制台输出为:

[EL Fine]: sql: 2017-12-17 13:48:33.214--ServerSession(286337061)--
Connection(2132504260)--Thread(Thread[http-nio-8080-exec-2,5,main])--
SELECT id_user, DOCNUM, EMAIL, FIRSTNAME, LASTNAME, PWD FROM USER
[prova.User@2d3017ff, prova.User@6361d00, prova.User@7ab0944a, 
prova.User@5945162f]

matteo
---
tony
---
bruce
---
peter
---

这与我在DB表中的内容完全一致...:(

共有1个答案

宇文飞翮
2023-03-14

尝试转换用户数组中的响应实体。json中的数组有适当的等价物。

另一种方法是为用户列表创建一个包装器类。

@XmlType
@XmlRootElement
class Wrapper {
  @XmlElement
  List<User> users;
}

在您的回复中返回此内容。

 类似资料:
  • 问题内容: 我正在尝试使用HttpServletRequest从发布的表单中检索传递给jax- rs的一些参数。但是,我的请求对象始终为我的参数返回空值。我不是要这样做吗?我已经在下面发布了代码,并发送了示例请求。 这是我的服务: 请求示例: 问题答案:

  • 问题内容: 我在检索Java中匿名PLSQL块的结果时遇到了一些麻烦。 这是块: 我把查询放在一个字符串中: 那字符串正确吗? 尝试检索的方法: 当我收到此消息时,它不起作用: 那我该如何找回呢? 问题答案: 这是因为 隐式 日期转换失败。添加而不是直接将日期字符串分配给日期变量。如果使用,则不需要。 隐式转换通常取决于会话的。 您的罪魁祸首。实际上将尝试转换为日期。因此引发了异常! 然后, 将设

  • 直接从HDFS读取文件,而不将其复制到本地文件系统。不过,我将结果复制到本地文件系统。 hduser@ubuntu:/usr/local/hadoop$mkdir/tmp/gutenberg-output bin/hadoop dfs-getmerge/user/hduser/gutenberg-output/tmp/gutenberg-output deprecated:不推荐使用此脚本执行hd

  • 在我看来,有一个与控制器的一个功能链接的输入文件 此函数调用服务中的一个函数,该函数假定将我的xml文件转换为json 在服务函数中,XML文件在文件读取器中读取,然后在文件读取器的onloadend部分转换为XML 如何在onloadend中检索转换后的json结果,以便在Angular控制器中使用它,特别是在promise的情况下?或者我应该使用setTimeout吗?

  • 我想在项目拆除脚本中添加项目的endpoint。在运行项目之前,用户将通过所有请求和测试请求分配他们的endpoint,为了获得所有请求和测试请求的endpoint,语法是什么? 我看到了一个使用测试步骤的示例,但我不想通过测试步骤路由检索它: 分解脚本使用日志、上下文、运行程序和项目变量。 谢谢

  • 问题内容: 给定简单的数据结构: 例子: 代表一种简单的树导航结构,以编程方式是检索可显示格式的树的最佳方法是什么?我们可以创建一条SQL语句来“按顺序”检索它们吗? 谢谢你的帮助!如果我的方法有误,请随时发表评论。 我正在使用SQL Server 2000。 问题答案: 如果您使用的是SQL Server 2008,则可能要尝试使用新的architectureid数据类型。 如果您不是,那么另一