Проверка существования сущности Spring Boot 2.2.5 (пользовательская проверка) - PullRequest
0 голосов
/ 28 марта 2020

Предположим, у меня есть следующие объекты:

package ir.darsineh.lms.dal.entity;

import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;

@Data
@Entity
@Table(name = "teacher")
public class Teacher implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;


    @Column(name = "bio")
    private String bio;


//    @JsonIgnore
//    @JsonManagedReference
    @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private User user;

}

package ir.darsineh.lms.dal.entity;

import com.fasterxml.jackson.annotation.JsonBackReference;
import lombok.Data;
import lombok.ToString;

import javax.persistence.*;
import javax.validation.constraints.Size;
import java.io.Serializable;

@Data
@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @Column(name = "id", updatable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "first_name")
    @Size(max = 255)
    private String firstName;

    @Column(name = "last_name")
    @Size(max = 255)
    private String lastName;

    @ToString.Exclude
    @JsonBackReference
    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY)
    private Teacher teacher;
}

и для получения данных запроса, а также для проверки входных данных у меня есть следующий класс:


package ir.darsineh.lms.http.request;

import ir.darsineh.lms.dal.repository.UserRepository;
import ir.darsineh.lms.validation.EntityExists;
import lombok.Data;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class TeacherCreateRequest {

    @NotNull(message = "user_id can not be null")
    @EntityExists(message = "user does not exists")
    private Long user_id;

    @NotNull(message = "bio can not be null")
    @Size(min = 20, max = 200, message = "bio field size should be between 20, 200 characters")
    private String bio;

}

и здесь мои пользовательские коды проверки:

package ir.darsineh.lms.validation;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;

@Target({ FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EntityExistsValidator.class)
@Documented
public @interface EntityExists {

    String message() default "{entity.not_exists}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

}

package ir.darsineh.lms.validation;

import ir.darsineh.lms.dal.repository.UserRepository;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;


public class EntityExistsValidator implements ConstraintValidator<EntityExists, Long> {

    private UserRepository userRepository;

    public EntityExistsValidator(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public boolean isValid(Long entity_id, ConstraintValidatorContext context) {

        if (userRepository.findById(entity_id).isPresent()) {
            return true;
        }
        else {
            return false;
        }

    }

}

, как вы видите, в настоящее время это правило проверки применимо для сущности пользователя, но мне нужно иметь возможность использовать эту проверку для всех отношений и всех сущностей. и для этой цели я думаю, что сдача репозитория любого типа решит мою проблему. может, мне стоит использовать дженерики, но я не знаю, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...