【发布时间】: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