3

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)
4

2 に答える 2

2

自動生成されたクエリ「SELECTuFROMUsers u」は、問題なく機能します。「u」は列を表していないため間違っている可能性があることを示唆するコメントによると、ここでは「u」はテーブルユーザーのエイリアスであるため、その提案は正しくありません。

さらにデバッグしてfindAll()、何かがnull、つまりEntityManagerであるかどうかを確認します。

@Stateless注釈UserFacadeは必要であり、削除するとEntityManagerがnullになる可能性があります(「データベースからのRestFul Webサービス」ウィザードを使用すると、NetBeansが配置するため、「削除」と記述したことに注意してください)。ここで同様の質問を参照してください。

最新の編集に関して:はい、これらの機能はJava Platform、EnterpriseEditionを使用して構築する必要があります。特に、RESTFul Webサービスは、ここで説明するように、Java EE6プラットフォームに含まれているRESTfulWebサービス用のJavaAPI(JAX-RS)を利用します。

GlassFish Server Open Source Editionは、Java EE 6プラットフォーム仕様の最初の互換性のある実装です。このアプリケーションサーバーを使用し、上記のリンク先のチュートリアルに従うことをお勧めします。

于 2012-01-15T09:13:45.650 に答える
0

@ori がその答えだと思います。テーブルUsersにはおそらく名前付きの列がないため、列をデータベースuに一致させようとすると例外が発生します。u

に変更するu.*と、正常に動作するはずです。

于 2012-01-15T08:16:59.280 に答える