2011-12-24 3 views
3

NetBeans 7의 "RESTful Web Services from Database ..."마법사를 사용하여 간단한 XML 웹 서비스를 만들었습니다. 이 시점에서 관련된 mySQL 데이터베이스에서 사용자 목록을 게시하려고합니다.RESTful 웹 서비스 : java.lang.NullPointerException service.AbstractFacade.findAll

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 클래스 :

public List<T> findAll() { 

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

질문 :

  • 이 필요한 @Stateless 주석인가

    //@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은 방법의 첫 번째 행에서 발생합니다 기능하는거야?

  • 이 패턴에는 J2SE 6 (내 OS X 워크 스테이션에 설치된 것)이 아닌 J2EE 6가 필요합니까? 'javax.ejb'네임 스페이스는 엔터프라이즈 자바 빈을 제안하는 것으로 보인다.

** 편집 **

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

'@NamedQuery'(이름 = "Users.findAll는"쿼리 = "사용자 U로부터 U 선택")? ''u. * 사용자를 선택하지 않았습니다. ' "? – ori

답변

2

"SELECT u FROM Users u"자동 생성 쿼리는 아무런 문제없이 작동합니다. "u"는 열을 나타내지 않으므로 "u"가 잘못되었을 수 있다는 의견에 따라 "u"가 테이블 사용자의 별칭이므로 제안이 올바르지 않습니다.

findAll()을 디버그하여 무언가 null인지 확인합니다 (즉, EntityManager). 마법사

UserFacade@Stateless 주석이 필요하며, 아마도 EntityManager를 야기를 제거하는 넷빈즈 장소는 당신을 위해 경우 "데이터베이스에서 RESTful 웹 서비스"를 사용하는 경우 때문에 나는 "제거"쓴 있습니다 (널 (null)로). 비슷한 질문이 here을 참조하십시오.최근 편집에 관한

: 예,이 기능은 Java Platform, Enterprise Edition를 사용하여 구축 될 필요가있다. 특히 RESTFul 웹 서비스는 here과 같이 Java EE 6 플랫폼에 포함 된 RESTful Web Services (JAX-RS) 용 Java API를 사용합니다.

글래스 피쉬 서버 오픈 소스 버전은 자바 EE 6 플랫폼 사양의 첫번째 호환 구현 :이 응용 프로그램 서버를 사용하여 위의 링크 된 튜토리얼을 다음과 같은 것이 좋습니다.

+0

Netbeans이 주석을 추가하지 않았습니다. 사실, 마법사가 만든 UserFacade는 아주 희소합니다. 내가 찾은 예제를 기반으로 코드를 수동으로 만들어야했습니다. 왜 이런 일이 일어 났는지 알고 싶습니다. .JAR 파일에이 주석이 포함되어 있는지 알고 계십니까? Netbeans 7에서 누락 된 파일을 확인할 수있는 방법이 있습니까 (방법을 찾을 수없는 것 같습니다)? – craig

+0

"Netbeans restful web services"방에서 채팅 할 수 있습니까? 나는 마법사가 만든 클래스 인 UserFacadeREST에 대해 이야기하고 있습니다. "데이터베이스의 새로운 안정적인 웹 서비스" – perissf

+0

Netbeans 7.1 (Glassfish 포함)의 EE 에디션을 설치했습니다. Tomcat 대신 Glassfish를 사용하여 프로젝트를 재 작성하면 기능 프로젝트가 생성됩니다. – craig

0

내가 @ori이 대답에 생각합니다. 테이블 Users에는 u이라는 열이 없을 수 있으므로 데이터베이스에 u 열을 일치 시키려고하면 예외가 발생합니다.

u.*으로 변경하면 정상적으로 작동합니다.

+0

'u'는 별칭이 아니라 열입니다. 귀하의 제안이 효과가 없습니다. – craig

+0

네, 그게 바로 당신이 '사용자로부터 선택하기'를 할 수없는 이유입니다. 당신은 'SELECT u. * FROM Users u'를해야합니다. –

+0

SQL과 비슷하지만 답이 맞을지라도 실제로는 [JPQL (Java Persistence Query Language) 문]입니다 (http : // en.wikipedia.org/wiki/Java_Persistence_Query_Language)이며 구문은 OK입니다. 여기에서 'u'는 엔터티 'Users'의 별칭입니다. –