2011-12-24 4 views
3

J'ai créé un service Web XML simple à l'aide de l'assistant "RESTful Web Services from Database ..." de NetBeans 7. À ce stade, je souhaite publier une liste d'utilisateurs à partir de la base de données mySQL associée. Lorsque j'essaie d'accéder au service via son URL (http: // localhost: 8080/database/resources/users), j'obtiens une erreur qui lit "java.lang.NullPointerException". La trace de la pile:Service Web RESTful: java.lang.NullPointerException service.AbstractFacade.findAll

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) 

entité utilisateur:

package entities; 
... 
@Entity 
@Table(name="users") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "Users.findAll", query = "SELECT u FROM Users u"), 
... 

J'ai également changé la requête nommée à User.findAll dans le cas où les noms doit aligner avec le nom de l'entité. Cela n'a pas résolu le problème.

Je ne suis pas certain si c'est «normal» ou non, mais l'assistant a créé une classe UserFacade assez clairsemée; J'ai ajouté les méthodes manquantes après avoir étudié le sujet. De plus, le paquet javax.ejb.Stateless semble manquer (peut-être pas sur CLASSPATH de mon poste de travail); C'est la raison pour laquelle l'annotation @Stateless est désactivée.

classe 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(); 
    } 

} 

exception est levée à la première ligne de la méthode findAll de AbstractFacade:

public List<T> findAll() { 

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

Questions:

  • l'annotation @Stateless nécessaire à cette Pour fonctionner?
  • Ce modèle nécessite-t-il J2EE 6 plutôt que J2SE 6 (qui est ce qui est installé sur ma station de travail OS X)? L'espace de noms 'javax.ejb' semble suggérer des beans Java d'entreprise.

** modifier **

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

'@NamedQuery (name =" Users.findAll ", query =" CHOISISSEZ-VOUS DES UTILISATEURS ")' ' pas '" CHOISIR u. * DE Utilisateurs u "'? – ori

Répondre

2

La requête générée automatiquement "SELECT u FROM Users" fonctionne sans aucun problème. Selon le commentaire suggérant que "u" pourrait être faux car il ne représente pas une colonne, cette suggestion n'est pas correcte car ici "u" est un alias pour les utilisateurs de la table.

Je déboguerais plus loin le findAll() pour vérifier si quelque chose est nul, c'est-à-dire l'EntityManager.

L'annotation @Stateless dans le UserFacade est nécessaire, et le retirer serait probablement provoquer la EntityManager être nulle (notez que j'écrit « enlever » car les places NetBeans si pour vous, si vous utilisez l'Assistant « RESTful Web Services de base de données »). Voir here une question similaire.

En ce qui concerne votre dernière édition: oui, ces fonctionnalités doivent être construites en utilisant le Java Platform, Enterprise Edition. En particulier, les services Web RESTFul utilisent l'API Java pour les services Web RESTful (JAX-RS) qui est incluse dans la plate-forme Java EE 6 comme expliqué here.

GlassFish Server Open Source Edition est la première implémentation compatible de la spécification de la plate-forme Java EE 6: Je suggère d'utiliser ce serveur d'applications et de suivre les tutoriels ci-dessus.

+0

Netbeans n'a pas ajouté l'annotation. En fait, la UserFacade créée par l'assistant était assez éparse. J'ai dû créer manuellement le code basé sur des exemples que j'ai trouvés. J'aimerais savoir pourquoi c'est arrivé. Savez-vous quel fichier .JAR contient cette annotation? Est-il possible de déterminer les fichiers manquants dans Netbeans 7 (je n'arrive pas à trouver un moyen)? – craig

+0

Pouvons-nous discuter dans la salle "Netbeans reposful web services"? Je parle de la classe UserFacadeREST créée par l'assistant "Nouveaux services Web reposants de la base de données" – perissf

+0

J'ai installé l'édition EE de Netbeans 7.1 (qui inclut Glassfish). Recréer le projet en utilisant Glassfish au lieu de Tomcat a généré un projet fonctionnel. – craig

0

Je pense que @ori est sur la réponse. Votre table Users n'a probablement pas de colonne nommée u donc vous obtenez une exception quand elle essaie de faire correspondre la colonne u à la base de données.

Passez à u.* et cela devrait fonctionner correctement.

+0

'u' est un alias, pas une colonne. Votre suggestion n'a pas fonctionné. – craig

+0

Ouais, c'est exactement pourquoi vous ne pouvez pas faire 'SELECT u FROM Users u'. Vous devez faire 'SELECT u. * FROM Utilisateurs' –

+0

Bien qu'il ressemble à SQL (et votre réponse aurait du sens si c'était le cas), il s'agit en fait d'une instruction [JPQL (Java Persistence Query Language)] (http: // en.wikipedia.org/wiki/Java_Persistence_Query_Language), et sa syntaxe est OK: ici, 'u' est un alias pour l'entité' Users'. –