Предположим, у меня есть следующие объекты:
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;
}
}
}
, как вы видите, в настоящее время это правило проверки применимо для сущности пользователя, но мне нужно иметь возможность использовать эту проверку для всех отношений и всех сущностей. и для этой цели я думаю, что сдача репозитория любого типа решит мою проблему. может, мне стоит использовать дженерики, но я не знаю, как это сделать.