【问题标题】:Retrieve results JAX-RS + Jersey + Jackson检索结果 JAX-RS + Jersey + Jackson
【发布时间】:2018-05-30 13:59:39
【问题描述】:

我有这个实体类

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

  • jackson-annotations-2.9.3.jar
  • jackson-core-2.9.3.jar
  • jackson-databind-2.9.3.jar
  • jackson-jaxrs-base-2.9.3.jar
  • jackson-module-jaxb-annotations-2.9.3.jar
  • jersey-media-json-jackson-2.26.jar
  • jackson-jaxrs-json-provider-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 内部服务器错误”的描述:

“服务器遇到了阻止它完成请求的意外情况。”

虽然从 Eclipse 控制台我可以看到

[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 数据?

谢谢

更新

按照建议,我已将 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
---

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

【问题讨论】:

  • 我强烈建议分而治之。您同时使用 JPA 和 JAX-RS。让您的 @GET 方法返回一个常量字符串:public String getUser() { return "test"; } 并检查它是否有效。如果确实如此,JAX-RS 基本上没问题。然后做 JPA 的东西,但不要在任何地方使用它们来消除纯粹的 JPA 问题。如果它有效,则可能是 JSON 问题。尝试发回您的测试和结果。
  • 我已经编辑了问题
  • 好的,JAX-RS 是干净的。 JPA 现在:直到并包括 getResultList() 的所有调用都给出正确的结果吗? listOfUser 是否包含它应该包含的内容?
  • 另外,User 中的Transaction 是什么?如果它只是另一个 POJO,则将其删除,以便我们可以消除它作为问题的根源。
  • 再次编辑问题以包含您建议的测试:)

标签: jackson jersey jax-rs java-ee-7


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2016-12-02
    • 1970-01-01
    • 2016-09-20
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多