RESTful Web服务:java.lang.NullPointerException service.AbstractFacade.findAll

时间:2011-12-24 20:18:12

标签: mysql osx-lion tomcat7 jdk1.6 netbeans-7

我使用NetBeans 7的“数据库中的RESTful Web服务...”向导创建了一个简单的XML Web服务。此时,我想从关联的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包似乎丢失了(可能不在我的工作站的CLASSPATH上);这就是禁用@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();
    } 

}

在AbstractFacade的findAll方法的第一行抛出异常:

public List<T> findAll() {  

  javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  ...
}

问题:

  • 这需要@Stateless注释吗?
  • 这种模式是否需要J2EE 6而不是J2SE 6(我的OS X工作站上安装的是什么)? 'javax.ejb'命名空间似乎建议企业java bean。

**编辑**

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

2 个答案:

答案 0 :(得分:2)

自动生成的查询“SELECT u FROM Users u”可以正常运行。根据评论表明“你”可能是错误的,因为它不代表一个列,该建议不正确,因为这里“u”是表用户的别名。

我会进一步调试findAll()来检查某些东西是否为null,即EntityManager。

@Stateless中的UserFacade注释是必要的,删除它可能会导致EntityManager为空(请注意我写了“删除”,因为NetBeans会为您放置,如果您使用“数据库“向导”中的RestFul Web服务。请参阅here类似的问题。

关于您的最新修改:是的,需要使用Java Platform, Enterprise Edition构建这些功能。特别是,RESTFul Web服务使用Java API for RESTful Web Services(JAX-RS),它包含在Java EE 6平台中,如here所述。

GlassFish Server Open Source Edition是Java EE 6平台规范的第一个兼容实现:我建议使用此Application Server并遵循上面链接的教程。

答案 1 :(得分:0)

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

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