首页 文章

检索结果JAX-RS Jersey Jackson

提问于
浏览
0

我有这个实体类

@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:

  • 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内部服务器错误”,其描述如下:

“服务器遇到意外情况,导致无法完成请求 . ”

从日食控制台我可以看到

[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吗?如果是,该怎么办?

谢谢

UPDATE 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”所以,一切都很好,而consoloe输出是:

[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 回答

  • 0

    尝试在一组用户中转换您的响应实体 . 在json中有适当的数组等效项 .

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

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

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

相关问题