java - REST 中的空指针异常

标签 java rest netbeans

我正在尝试使用 netbeans 帮助程序进行 REST。 我将持久性统一起来,将数据库中的实体进行统一,最后将实体类中的 RESful Web 服务进行统一。所有这些都在netbeans的帮助下,我没有触及任何代码,它等于它是如何创建的。但它给我一个错误,它不起作用:

这是错误

stack trace

这是实体:

@Entity
@Table(name = "clientes")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Cliente.findAll", query = "SELECT c FROM Cliente c")
    , @NamedQuery(name = "Cliente.findByCliRut", query = "SELECT c FROM Cliente c WHERE c.cliRut = :cliRut")
    , @NamedQuery(name = "Cliente.findByCliNombre", query = "SELECT c FROM Cliente c WHERE c.cliNombre = :cliNombre")})
public class Cliente implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "cli_rut")
private String cliRut;
@Basic(optional = false)
@Column(name = "cli_nombre")
private String cliNombre;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "venRutCliente")
private List<Venta> ventaList;

public Cliente() {
}

public Cliente(String cliRut) {
    this.cliRut = cliRut;
}

public Cliente(String cliRut, String cliNombre) {
    this.cliRut = cliRut;
    this.cliNombre = cliNombre;
}

public String getCliRut() {
    return cliRut;
}

public void setCliRut(String cliRut) {
    this.cliRut = cliRut;
}

public String getCliNombre() {
    return cliNombre;
}

public void setCliNombre(String cliNombre) {
    this.cliNombre = cliNombre;
}

@XmlTransient
public List<Venta> getVentaList() {
    return ventaList;
}

public void setVentaList(List<Venta> ventaList) {
    this.ventaList = ventaList;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (cliRut != null ? cliRut.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Cliente)) {
        return false;
    }
    Cliente other = (Cliente) object;
    if ((this.cliRut == null && other.cliRut != null) || (this.cliRut != null && !this.cliRut.equals(other.cliRut))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "entities.Cliente[ cliRut=" + cliRut + " ]";
}

}

这是 REST ws:

@javax.ejb.Stateless
@Path("cliente")

public class ClienteREST extends AbstractFacade<Cliente> {

@PersistenceContext(unitName = "VentasAPIPU")
private EntityManager em;

public ClienteREST() {
    super(Cliente.class);
}

@POST
@Override
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void create(Cliente entity) {
    super.create(entity);
}

@PUT
@Path("{id}")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void edit(@PathParam("id") String id, Cliente entity) {
    super.edit(entity);
}

@DELETE
@Path("{id}")
public void remove(@PathParam("id") String id) {
    super.remove(super.find(id));
}

@GET
@Path("{id}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Cliente find(@PathParam("id") String id) {
    return super.find(id);
}

@GET
@Override
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Cliente> findAll() {
    return super.findAll();
}

@GET
@Path("{from}/{to}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public List<Cliente> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) {
    return super.findRange(new int[]{from, to});
}

@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public String countREST() {
    return String.valueOf(super.count());
}

@Override
protected EntityManager getEntityManager() {
    return em;
}

}

我找不到错误,这是我第一次使用这个,我不知道我是否跳过了某个步骤或什么。

编辑: 抽象外观类

public abstract class AbstractFacade<T> {

private Class<T> entityClass;

public AbstractFacade(Class<T> entityClass) {
    this.entityClass = entityClass;
}

protected abstract EntityManager getEntityManager();

public void create(T entity) {
    getEntityManager().persist(entity);
}

public void edit(T entity) {
    getEntityManager().merge(entity);
}

public void remove(T entity) {
    getEntityManager().remove(getEntityManager().merge(entity));
}

public T find(Object id) {
    return getEntityManager().find(entityClass, id);
}

public List<T> findAll() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return getEntityManager().createQuery(cq).getResultList();
}

public List<T> findRange(int[] range) {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    javax.persistence.Query q = getEntityManager().createQuery(cq);
    q.setMaxResults(range[1] - range[0] + 1);
    q.setFirstResult(range[0]);
    return q.getResultList();
}

public int count() {
    javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
    javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
    cq.select(getEntityManager().getCriteriaBuilder().count(rt));
    javax.persistence.Query q = getEntityManager().createQuery(cq);
    return ((Long) q.getSingleResult()).intValue();
}

}

最佳答案

还请添加 AbstractFacade 类代码。另外,检查 Cliente 表不为空。您可以通过放置断点并单步执行来对其进行调试。 'findAll' 可能为空并返回 null。 然而,AbstractFacade 可能会有很大帮助。

关于java - REST 中的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47799211/

相关文章:

java - Swagger 415 不支持的媒体类型 : application/json instead of text/plain in POST request

java - 对于PreparedStatement 类型,方法 getInt、getString 和 getDate 未定义

c - 调试结果和构建/运行结果之间的差异 - Netbeans 中的 C

java - Java中奇怪的数组声明

java - 创建 Kafka Producer 并调用方法 send()、flush() 和 close() 的正确顺序是什么?

java - 使用单个 6 面骰子,计算达到某个数字的可能方法

java - 初始化后如何更改JTable?

java - HTTP 406 通过休息调用下载文件

java - 是否有使用 Maven 和 Hibernate/Spring 进行 Java 编程的轻量级 IDE?

java - SQL 中的选择语句、联接和重新调整查询用途