NetBeans 7 の「RESTful Web Services from Database...」ウィザードを使用して、単純な 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 アノテーションが必要ですか?
- このパターンでは、J2SE 6 (OS X ワークステーションにインストールされているもの) ではなく、J2EE 6 が必要ですか? 「javax.ejb」名前空間は、エンタープライズ Java Bean を示唆しているようです。
** 編集 **
- Java SE 6 (1.6.0_29-b11-402)