我正在使用Spring Rest。我有一个叫做Operator的实体,它像这样:
@Entity
@Table(name = "operators")
public class Operator {
//various properties
private List<OperatorRole> operatorRoles;
//various getters and setters
@LazyCollection(LazyCollectionOption.TRUE)
@OneToMany(mappedBy = "operator",cascade = CascadeType.ALL)
public List<OperatorRole> getOperatorRoles() {
return operatorRoles;
}
public void setOperatorRoles(List<OperatorRole> operatorRoles) {
this.operatorRoles = operatorRoles;
}
}
我也有相应的OperatorRepository extends JpaRepository
我定义了一个公开此API的控制器:
@RestController
@RequestMapping("/api/operators")
public class OperatorController{
private final OperatorRepository operatorRepository;
@Autowired
public OperatorController(OperatorRepository operatorRepository) {
this.operatorRepository = operatorRepository;
}
@GetMapping(value = "/myApi")
@Transactional(readOnly = true)
public MyResponseBody myApi(@ApiIgnore @AuthorizedConsumer Operator operator){
if(operator.getOperatorRoles()!=null) {
for (OperatorRole current : operator.getOperatorRoles()) {
//do things
}
}
}
}
在我使OperatorRoles列表变得懒惰之前,这曾经起作用过;现在,如果我尝试遍历列表,则会抛出LazyInitializationException。
通过扩展Spring的BasicAuthenticationFilter的过滤器从数据库中获取Operator参数,然后以某种方式将其自动连接到API调用中。
我可以毫无问题地获得其他非延迟初始化的属性。如果我执行类似operator = operatorRepository.getOne(operator.getId());
的操作,则一切正常,但是我需要在代码中的太多点处进行更改。
据我了解,问题在于,当我到达OperatorController中的实际API时,用于获取BasicAuthenticationFilter中的Operator的会话不再打开。
我设法将所有内容都包装在OpenSessionInViewFilter中,但仍然无法正常工作。
有人有什么想法吗?