2011-01-22 6 views
0

JAX-WS @Path 및 @Stateless (또는 @RequestScoped) 주석을 사용할 때 LIE가 발생합니다. 코드 :JAX-WS와 JEE6을 사용할 때 두려운 지연 초기화 예외

@Path("/users") 
@Stateless 
@Produces(MediaType.APPLICATION_XML) 
public class UserResourceRESTService { 
    @Inject 
    @UserRepository 
    @PersistenceContext 
    private EntityManager em; 

    @GET 
    @Path("/{id:[1-9][0-9]*}") 
    public User lookupUserById(@PathParam("id") long id) { 
     return em.find(User.class, id); 
    } 
} 

실제 예외 내가 점점 오전 :

org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 -

사용자 개체가 주소를 가지고있는 세션을하는 나라가있다. 이것을 스테이트 풀 빈으로 변경하고 확장 된 컨텍스트를 사용하면 작동하지만 실제로는 SFSB가 아니어야합니다. 나는 "em"이 상태없는 빈을 사용할 때 세션을 열 수없는 이유에 대해 약간의 상실을 겪고있다.

+1

NullPointerException 이후에, 이것은 java 세계에서 가장 일반적인 예외입니다. google 및 stackoverflow에 대한 귀하의 검색 결과는 무엇입니까? – Bozho

답변

0

확장 된 지속성 컨텍스트에서 작업 할 때 반환 된 User 엔티티는 관리 상태로 유지되며 트랜잭션 지속성 컨텍스트 트랜잭션이 끝나면 lookupUserById() 메서드가 반환되고 해당 메서드의 결과는 이미 지속성에서 분리 된 엔티티입니다 문맥. 결과적으로 LAZY로 표시된 해당 엔티티의 모든 특성에 더 이상 액세스 할 수 없습니다.

엔티티가 지속성 컨텍스트에서 분리 된 후에 이러한 지연 등록 정보에 액세스하려면 lookupUserById 메소드에서 리턴하기 전에 해당 엔티티에 대해 특정 getter 메소드를 호출하십시오.

public User lookupUserById(@PathParam("id") long id) { 
    User user = em.find(User.class, id); 
    user.getAddress().getCountry(); 
    return user; 
} 
+0

고마워요. 이 메서드는 User 객체를 반환하고, XML 직렬화는 @Produces 태그를 통해 발생합니다. 따라서 LIE가 발생합니다. 하나의 메소드에서 RESTful 방식으로 XML/JSON으로 GET 요청을 직렬화하는 것이 매우 일반적이므로 다소 놀랍다. – Simon

0

또한 fetch = FetchType.EAGER와 사용자 클래스의 관계 주석을 달 수 있습니다. 당신이 항상 모든 것을 돌려 준다면, 제 의견으로는 게으른로드가 필요하지 않습니다.

+0

감사합니다.이 경우 실제로 (FetchType.EAGER를 사용하여)이 방법을 사용했습니다. RESSTful 서비스에 공통적 인 문제인 것 같았 기 때문에 나는 정말로 호기심이 많았습니다. – Simon

+0

분명히 그것은 버그입니다. @Producer가 제작을 마칠 때까지 세션이 SLSB에서 열려 있으면 안됩니다 ... ??? – Simon

관련 문제