按角色过滤用户会导致无限递归

时间:2019-03-22 05:04:06

标签: java spring postgresql jpa jhipster

概述 我正在学习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() + "'" +
            "}";
    }
}

注释

  • 我真的对Angular,Java和Jhipster陌生。
  • 如果我错过了重要的事情,请在评论中让我知道 我将添加到问题中。
  • 我只是想吸引ADMIN用户,所以如果您有更好的 我真的很想知道的方式

0 个答案:

没有答案