概述 我正在学习Angular Java和JHipster,并且尝试按角色过滤用户,但即时获取了无限递归。
这是我的 userRepository.java
@Query(value = "select user from User user inner join user.authorities authorities where authorities.name =:role")
List<User> findByRole(@Param("role") String role);
我试图在用户表和user_authority表之间进行内部联接,将角色解析为字符串"ROLE_ADMIN"
Upadte
如果我执行此操作select user.login
而不是select users
,则在模型中找到了某些内容而没有得到递归错误,因此我认为可能是因为模型多次调用自身。
我与另一个名为extendedUser的实体(用于保存其他信息)具有1:1的关系,在extendedUser中,我与名为coordinator的用户具有另一种关系,因此我认为模型正在调用自身。
这只是控制台中递归的一部分:
2019-03-22 14:08:32.082 WARN 12044 --- [ XNIO-2 task-9] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain:["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]->com.gits.sigem.domain.ExtendedUser["usuario"]->com.gits.sigem.domain.User["extendedUser"]
这是我在遇到问题时在扩展用户上的 DTO
/**
* A DTO for the ExtendedUser entity.
*/
public class ExtendedUserDTO extends UserDTO implements Serializable {
private final Logger log = LoggerFactory.getLogger(ExtendedUserDTO.class);
private Long id;
private String puesto;
private BigDecimal sueldo;
private LocalDate fechaIngreso;
private Long usuarioId;
//private Long coordinadorId;
private Set<Area> areas = new HashSet<>();
private Long coordinadorId;
private String coordinadorLogin;
private User coordinador;
private Set<Desarrollo> desarrollos = new HashSet<>();
public ExtendedUserDTO(){
}
public ExtendedUserDTO(User user){
super(user);
this.puesto = user.getExtendedUser().getPuesto();
this.sueldo = user.getExtendedUser().getSueldo();
this.fechaIngreso = user.getExtendedUser().getFechaIngreso();
this.id = user.getId();
this.usuarioId = user.getId();
this.coordinadorLogin = user.getExtendedUser().getCoordinador().getLogin();
this.coordinadorId = user.getExtendedUser().getCoordinador().getId();
this.coordinador = user.getExtendedUser().getCoordinador();
Hibernate.initialize(user.getExtendedUser().getAreas());
this.areas = user.getExtendedUser().getAreas();
Hibernate.initialize(user.getExtendedUser().getDesarrollos());
this.desarrollos = user.getExtendedUser().getDesarrollos();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPuesto() {
return puesto;
}
public void setPuesto(String puesto) {
this.puesto = puesto;
}
public BigDecimal getSueldo() {
return sueldo;
}
public void setSueldo(BigDecimal sueldo) {
this.sueldo = sueldo;
}
public LocalDate getFechaIngreso() {
return fechaIngreso;
}
public void setFechaIngreso(LocalDate fechaIngreso) {
this.fechaIngreso = fechaIngreso;
}
public Long getUsuarioId() {
return usuarioId;
}
public void setUsuarioId(Long userId) {
this.usuarioId = userId;
}
/* public void setCoordinadorId(Long userId) {
this.coordinadorId = userId;
}
public Long getCoordinadorId() {
return coordinadorId;
}*/
public User getCoordinador() {
return coordinador;
}
public void setCoordinador(User user) {
this.coordinador = user;
}
public Set<Area> getAreas() {
return areas;
}
public void setAreas(Set<Area> areas) {
this.areas = areas;
}
public Set<Desarrollo> getDesarrollos() {
return desarrollos;
}
public void setDesarrollos(Set<Desarrollo> desarrollos) {
this.desarrollos = desarrollos;
}
public Long getCoordinadorId() {
return coordinadorId;
}
public void setCoordinadorId(Long userId) {
this.coordinadorId = userId;
}
public String getCoordinadorLogin() {
return coordinadorLogin;
}
public void setCoordinadorLogin(String userLogin) {
this.coordinadorLogin = userLogin;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ExtendedUserDTO extendedUserDTO = (ExtendedUserDTO) o;
if (extendedUserDTO.getId() == null || getId() == null) {
return false;
}
return Objects.equals(getId(), extendedUserDTO.getId());
}
@Override
public int hashCode() {
return Objects.hashCode(getId());
}
@Override
public String toString() {
return "ExtendedUserDTO{" +
"id=" + getId() +
", puesto='" + getPuesto() + "'" +
", sueldo=" + getSueldo() +
", fechaIngreso='" + getFechaIngreso() + "'" +
", usuario=" + getUsuarioId() +
", coordinador='" + getCoordinadorLogin() + "'" +
"}";
}
}
注释