【问题标题】:RESTful web service: java.lang.NullPointerException service.AbstractFacade.findAllRESTful Web 服务:java.lang.NullPointerException service.AbstractFacade.findAll
【发布时间】:2011-12-24 20:18:12
【问题描述】:

我使用 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 工作站上安装了 J2SE 6)? “javax.ejb”命名空间似乎暗示了企业 Java bean。

** 编辑 **

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

【问题讨论】:

  • @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u")??不是"SELECT u.* FROM Users u"?

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


【解决方案1】:

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

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

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

关于您的最新编辑:是的,这些功能需要使用Java Platform, Enterprise Edition 构建。具体而言,RESTFul Web 服务利用 Java API for RESTful Web Services (JAX-RS),如 here 所述,该 API 包含在 Java EE 6 平台中。

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

【讨论】:

  • Netbeans 没有添加注释。事实上,向导创建的 UserFacade 非常稀疏。我不得不根据我找到的示例手动创建代码。我希望我知道为什么会这样。你知道哪个 .JAR 文件包含这个注解吗?有没有办法确定 Netbeans 7 中丢失的文件(我似乎找不到方法)?
  • 我们可以在“Netbeans restful web services”房间聊天吗?我说的是由向导“New Restful Web services from Database”创建的类 UserFacadeREST
  • 我安装了 Netbeans 7.1 的 EE 版(包括 Glassfish)。使用 Glassfish 而不是 Tomcat 重新创建项目会生成一个功能性项目。
【解决方案2】:

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

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

【讨论】:

  • 'u' 是别名,而不是列。您的建议无效。
  • 是的,这就是为什么你不能做SELECT u FROM Users u。你需要做SELECT u.* FROM Users u
  • 虽然它看起来像 SQL(如果是的话,你的答案会很有意义),这实际上是一个 JPQL (Java Persistence Query Language) statement,它的语法是可以的:这里,u 是实体的别名Users.
猜你喜欢
  • 2011-03-19
  • 1970-01-01
  • 2012-09-12
  • 2012-09-10
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多