Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC+;Rest API-未能延迟初始化集合_Java_Hibernate_Rest_Spring Mvc_Jpa - Fatal编程技术网

Java Spring MVC+;Rest API-未能延迟初始化集合

Java Spring MVC+;Rest API-未能延迟初始化集合,java,hibernate,rest,spring-mvc,jpa,Java,Hibernate,Rest,Spring Mvc,Jpa,我正在使用SpringMVC构建一个应用程序。该流程非常基本,即控制器-->服务-->DAO及其后 现在,我正在创建一个RestController,它将调用服务并执行我想要的任何操作。我遇到了一个奇怪的问题,我需要帮助 我有两个实体用户和角色。一个用户可以有多个角色,一个角色可以分配给多个用户-基本上是一个多个映射。我为这两个依赖项提供了FetchType.LAZY 当我通过浏览器登录时,Web应用程序中的一切都正常工作。但是,当我调用RESTController时,我得到以下错误 org.s

我正在使用SpringMVC构建一个应用程序。该流程非常基本,即控制器-->服务-->DAO及其后

现在,我正在创建一个RestController,它将调用服务并执行我想要的任何操作。我遇到了一个奇怪的问题,我需要帮助

我有两个实体用户角色。一个用户可以有多个角色,一个角色可以分配给多个用户-基本上是一个多个映射。我为这两个依赖项提供了FetchType.LAZY

当我通过浏览器登录时,Web应用程序中的一切都正常工作。但是,当我调用RESTController时,我得到以下错误

org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: failed to lazily initialize a collection of role: com.xx.yyy.entity.Role.users, could not initialize proxy - no Session (through reference chain: com.xx.yyy.entity.User["roles"]->org.hibernate.collection.internal.PersistentBag[0]->com.xx.yyy.entity.Role["users"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.xx.yyy.entity.Role.users, could not initialize proxy - no Session (through reference chain: com.xx.yyy.entity.User["roles"]->org.hibernate.collection.internal.PersistentBag[0]->com.xx.yyy.entity.Role["users"])
org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:238)
org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101)
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:202)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
奇怪的是,当我在UI上(即,在我的web应用程序上)时,它工作得非常好

以下是我的实体

User.java

@Entity
@Table(name="USERS")

public class User {
    @Id
    @Column (name="USER_ID")
    private String id;

    @NotEmpty(message = "First Name is mandatory")
    @Column (name="FIRST_NAME")
    private String firstName;

    @Column (name="LAST_NAME")
    private String lastName;

    @NotEmpty(message= "Email ID is mandatory")
    @Column (name="EMAIL_ID")
    private String emailId;

    @NotEmpty(message="Primary Phone Number is mandatory")
    @Column (name="PHONE_1")
    private String primaryPhone;

    @Column (name="PHONE_2")
    private String secondaryPhone;

    @Column (name="PASS_WORD")
    private String password;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable( name="ROLESMAPPING", joinColumns={@JoinColumn(name="USER_ID")}, inverseJoinColumns={@JoinColumn(name="GROUP_ID")})
    private List<Role> roles = new ArrayList<Role>();


    @Transient
    private List<String> roleIDs = new ArrayList<String>();

    //Getters and Setters

}
@Entity
@Table( name="ROLES" )
public class Role {

    @Id
    @Column( name="GROUP_ID")
    private String id;

    @Column( name="GROUP_DESC" )
    private String description;

    @ManyToMany(mappedBy="roles")
    @LazyCollection(LazyCollectionOption.TRUE)
    private List<User> users = new ArrayList<User>();

    //Getters and Setters go here
}
以下是我试着做的

我在同一个错误上引用了一些其他帖子,并尝试在我的两个实体上设置Fetch类型为EAGER(即,
Fetch=FetchType.EAGER
)。接下来发生的事情是,用户详细信息与角色一起被获取,角色又让用户一起被获取,这是在一个不确定的循环中发生的。我作为输出得到的JSON是永无止境的


请帮助我理解我的错误所在。

多亏了@Boris the Spider,我看了看,答案就在那里

为了解决这个问题,我所做的只是将
@JsonIgnore
添加到子类中引用父实体的字段中,如下所示

@Entity
@Table( name="ROLES" )
public class Role {

    @Id
    @Column( name="GROUP_ID")
    private String id;

    @Column( name="GROUP_DESC" )
    private String description;

    @ManyToMany(mappedBy="roles")
    @JsonIgnore
    private List<User> users = new ArrayList<User>();

    //Getters and Setters go here
}
@实体
@表(name=“ROLES”)
公共阶级角色{
@身份证
@列(name=“GROUP\u ID”)
私有字符串id;
@列(name=“GROUP_DESC”)
私有字符串描述;
@许多(mappedBy=“角色”)
@杰索尼奥雷
private List users=new ArrayList();
//能手和二传手都在这里
}

这解决了无限循环的问题。

多亏了@Boris the Spider,我看到了,答案就在那里

为了解决这个问题,我所做的只是将
@JsonIgnore
添加到子类中引用父实体的字段中,如下所示

@Entity
@Table( name="ROLES" )
public class Role {

    @Id
    @Column( name="GROUP_ID")
    private String id;

    @Column( name="GROUP_DESC" )
    private String description;

    @ManyToMany(mappedBy="roles")
    @JsonIgnore
    private List<User> users = new ArrayList<User>();

    //Getters and Setters go here
}
@实体
@表(name=“ROLES”)
公共阶级角色{
@身份证
@列(name=“GROUP\u ID”)
私有字符串id;
@列(name=“GROUP_DESC”)
私有字符串描述;
@许多(mappedBy=“角色”)
@杰索尼奥雷
private List users=new ArrayList();
//能手和二传手都在这里
}

这解决了无限循环问题。

您需要使用“视图中打开会话”模式。似乎您的
用户
被从数据库中拉出来,然后会话被关闭,然后您尝试呈现您的视图(JSON或其他)-此时抛出异常。谢谢,但我该怎么做呢?Google“Spring JPA open session in view”。非常感谢,我做到了。Spring论坛上关于这一点的一篇帖子提到了如何扩展我的PersistenceContext。为此,我将注释修改为@PersistenceContext(type=PersistenceContextType.EXTENDED)。但是,正如我在文章中提到的,它现在可以工作了,它进入了一个无限循环(用户获取所有角色,用户内部获取用户,反之亦然,以此类推)。。我错过什么了吗?是的。JSON不支持任何类型的对象引用。JSON中不能有双向关系。这应该是显而易见的。您需要使用“在视图中打开会话”模式。似乎您的
用户
被从数据库中拉出来,然后会话被关闭,然后您尝试呈现您的视图(JSON或其他)-此时抛出异常。谢谢,但我该怎么做呢?Google“Spring JPA open session in view”。非常感谢,我做到了。Spring论坛上关于这一点的一篇帖子提到了如何扩展我的PersistenceContext。为此,我将注释修改为@PersistenceContext(type=PersistenceContextType.EXTENDED)。但是,正如我在文章中提到的,它现在可以工作了,它进入了一个无限循环(用户获取所有角色,用户内部获取用户,反之亦然,以此类推)。。我错过什么了吗?是的。JSON不支持任何类型的对象引用。JSON中不能有双向关系。这应该是显而易见的。