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