Mysql RESTful web服务:java.lang.NullPointerException服务.AbstractFacade.findAll

Mysql RESTful web服务:java.lang.NullPointerException服务.AbstractFacade.findAll,mysql,osx-lion,tomcat7,jdk1.6,netbeans-7,Mysql,Osx Lion,Tomcat7,Jdk1.6,Netbeans 7,我使用NetBeans7的“来自数据库的RESTfulWeb服务…”向导创建了一个简单的XMLWeb服务。现在,我想从相关的mySQL数据库发布一个用户列表 当我试图通过其URL访问该服务时(http://localhost:8080/database/resources/users),我得到一个错误,读作“java.lang.NullPointerException”。堆栈跟踪: service.AbstractFacade.findAll(AbstractFacade.java:41) se

我使用NetBeans7的“来自数据库的RESTfulWeb服务…”向导创建了一个简单的XMLWeb服务。现在,我想从相关的mySQL数据库发布一个用户列表

当我试图通过其URL访问该服务时(http://localhost:8080/database/resources/users),我得到一个错误,读作“java.lang.NullPointerException”。堆栈跟踪:

service.AbstractFacade.findAll(AbstractFacade.java:41)
service.UserFacade.findAll(UserFacade.java:51)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:165)
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:67)
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:276)
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:83)
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:133)
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:71
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1171)  com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1103)  com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1053)
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1043)
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:406)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:477)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:662)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
用户实体:

package entities;
...
@Entity
@Table(name="users")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"), 
...
我还将命名查询更改为User.findAll,以防名称需要与实体名称对齐。这并没有解决问题

我不确定它是否“正常”,但向导创建了一个相当稀疏的UserFacade类;在研究了这个主题之后,我添加了缺少的方法。此外,javax.ejb.Stateless包似乎丢失了(可能不在我工作站的类路径上);这就是@Stateless注释被禁用的原因

UserFacade类:

//@Stateless
@Path("users")
public class UserFacade extends AbstractFacade<User> {

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

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

    public UserFacade() {
        super(User.class);
    } 

    @GET
    @Path("{id}")
    @Produces({"application/xml", "application/json"})
    public User find(@PathParam("id") BigDecimal id) {
        return super.find(id);
    }

    @GET
    @Override
    @Produces({"application/xml", "application/json"})
    public List<User> findAll() {
        return super.findAll();
    } 

}
/@无状态
@路径(“用户”)
公共类UserFacade扩展了AbstractFacade{
@PersistenceContext(unitName=“databasePU”)
私人实体管理者;
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
公共UserFacade(){
super(User.class);
} 
@得到
@路径(“{id}”)
@产生({“application/xml”、“application/json”})
公共用户查找(@PathParam(“id”)BigDecimal id){
返回super.find(id);
}
@得到
@凌驾
@产生({“application/xml”、“application/json”})
公共列表findAll(){
返回super.findAll();
} 
}
在AbstractFacade的findAll方法的第一行引发异常:

public List<T> findAll() {  

  javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  ...
}
公共列表findAll(){
javax.persistence.CriteriaQuery cq=getEntityManager().getCriteriaBuilder().createQuery();
...
}
问题:

  • 此功能是否需要@Stateless注释
  • 这个模式是否需要J2EE6而不是J2SE6(安装在我的OSX工作站上的)?“javax.ejb”名称空间似乎建议使用企业JavaBean
**编辑**

  • Java SE 6(1.6.0_29-b11-402)

    • 我认为@ori在答案上。您的表
      Users
      可能没有名为
      u
      的列,因此当它尝试将列
      u
      与数据库匹配时,会出现异常

      更改为
      u.*
      应该可以正常工作。

      自动生成的查询“从用户u中选择u”可以正常工作。根据注释,建议“u”可能是错误的,因为它不代表列,该建议是不正确的,因为这里“u”是表用户的别名

      我将进一步调试
      findAll()
      ,以检查是否有空的内容,即EntityManager

      UserFacade
      中的
      @Stateless
      注释是必需的,删除它可能会导致EntityManager为空(请注意,我写了“删除”,因为如果您使用“RestFul Web Services from Database”向导,NetBeans会为您放置if)。请看一个类似的问题

      关于您的最新编辑:是的,这些功能需要使用。特别是,RESTFul web服务使用Java API for RESTFul web服务(JAX-RS),如前所述,该API包含在JavaEE6平台中


      GlassFish Server开源版是Java EE 6平台规范的第一个兼容实现:我建议使用此应用程序服务器并遵循上面链接的教程。

      @NamedQuery(name=“Users.findAll”,query=“SELECT u FROM Users u”)
      ??不是
      “从用户u中选择u.*”
      ?Netbeans没有添加注释。事实上,向导创建的UserFacade非常稀疏。我必须根据我找到的示例手动创建代码。我希望我知道为什么会这样。您知道哪个.JAR文件包含此注释吗?有没有办法确定Netbeans 7中丢失的文件(我似乎找不到办法)?我们可以在“Netbeans restful web服务”房间里聊天吗?我说的是由向导“NewRESTfulWebservicesfromDatabase”创建的UserFacadeREST类,我安装了NetBeans7.1的EE版(包括Glassfish)。使用Glassfish而不是Tomcat重新创建项目生成了一个功能项目。“u”是别名,而不是列。你的建议不起作用。是的,这就是为什么你不能从用户中选择你。您需要执行
      SELECT u.*FROM Users u
      虽然它看起来像SQL(如果是的话,您的答案也会有意义),但实际上这是一个,它的语法是OK的:这里,
      u
      是实体
      用户的别名。