Фильтр пользователя по роли вызывает бесконечную рекурсию - PullRequest
0 голосов
/ 22 марта 2019

Обзор Я изучаю 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, анализируя роль как String "ROLE_ADMIN"

Upadte

Нашел что-то в модели, если я сделаю это select user.login вместо select users, не получит ошибку рекурсии, поэтому я думаю, что, возможно, причина в модели вызывает себя несколько раз.

У меня есть отношение 1: 1 с другой сущностью с именем extendedUser (для сохранения дополнительной информации), а в extendedUser у меня есть другая связь с пользователем, называемая координатором, поэтому я думаю, что модель вызывает сама.

Это только часть рекурсии в консоли:

    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, так что если у вас есть лучше как мне бы очень хотелось узнать
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...