检索结果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的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat 使用 Jersey Jax-RS 在单个服务器上执行 15K 请求/秒