检索结果JAX-RS + Jersey + Jackson

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检索结果JAX-RS + Jersey + Jackson相关的知识,希望对你有一定的参考价值。

我有这个实体类

@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;
}

}

从数据库表生成。然后我有这个休息服务

@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。出于这个原因,我在我的构建路径中添加了以下.jars:

  • 杰克逊的注解 - 2.9.3.jar
  • 杰克逊核心2.9.3.jar
  • 杰克逊 - 数据绑定 - 2.9.3.jar
  • 杰克逊 - JAXRS碱基2.9.3.jar
  • 杰克逊模块JAXB的注释 - 2.9.3.jar
  • 新泽西媒体JSON - 杰克逊2.26.jar
  • 杰克逊JAXRS JSON的提供商 - 2.9.3.jar

然后我有一个ApplicationConfig.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");
    }
}

当我尝试向邮递员提交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是我的实体管理器的名称),但后来我有了GRAVE:MessageBodyWriter错误我到底做错了什么?为什么我无法检索我的JSON数据?

谢谢

UPDATE

按照建议,我已经将GET资源修改为

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

    return String.valueOf(10+4);

}

并提交GET请求给了我Postman“14”的预期JSON答案....

问题可能是将List转换为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中的表格完全一致...... :(

答案

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

其他方式是为您的用户列表提供包装类。

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

在您的回复中返回此信息。

以上是关于检索结果JAX-RS + Jersey + Jackson的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 JAX-RS / Jersey?

Tomcat 使用 Jersey Jax-RS 在单个服务器上执行 15K 请求/秒

springboot 之 JAX-RS 和 Jersey

如何使用 JAX-RS 和 Jersey 处理 CORS

Jersey / JAX-RS ExceptionMapper MySQL

如何使用JAX-RS和Jersey处理CORS