I'm using Spring Data Rest dependency which makes endpoints for me, I think something is wrong from there but cannot know how to manage this.
ProgrammeNomUnique:
@Constraint(validatedBy = NomUniqueValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface ProgrammeNomUnique {
// define default error message
String message() default "Un programme porte déjà le même nom";
// define default groups
public Class<?>[] groups() default {};
// define default payloads
public Class<? extends Payload>[] payload() default {};
}
NomUniqueValidator:
@Component
@RequiredArgsConstructor
public class NomUniqueValidator implements ConstraintValidator<ProgrammeNomUnique, String> {
@Autowired
private ProgrammeRepository programmeRepository;
@Override
public void initialize(ProgrammeNomUnique constraintAnnotation) {
}
@Override
public boolean isValid(String nouveauNom, ConstraintValidatorContext constraintValidatorContext) {
return !programmeRepository.existsByNom(nouveauNom);
}
}
ProgrammeRepository
@CrossOrigin(origins = "http://localhost:4200")
@RepositoryRestResource(path = "programmes")
public interface ProgrammeRepository extends JpaRepository<Programme, Integer> {
boolean existsByNom(String nom);
}
Programme
@Getter
@Setter
@RequiredArgsConstructor
@Entity
@Table(name = "programme")
public class Programme {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_programme")
private int id;
@NotEmpty(message = "Le programme doit avoir un nom")
@Column
@ProgrammeNomUnique //<--- HERE
private String nom;
@NotNull(message = "Le programme doit avoir un prix")
@Column
private double prix;
@NotNull(message = "Le programme doit avoir une durée")
@Column(name = "duree_semaine")
private String dureeSemaine;
@NotEmpty(message = "Le programme doit avoir une description")
@Column
private String description;
@Column(name = "is_a_la_une")
private int isALaUne;
@Column(name = "services_associes")
private String servicesAssocies;
@Column(name = "id_image")
private int idImage;
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE,
CascadeType.REFRESH, CascadeType.PERSIST}, fetch = FetchType.LAZY)
@JoinColumn(name = "id_programme")
private List<Section> sections;
//////
}
I tried this but seems to be useless
@Configuration
public class ValidatorConfig {
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!-- https://stackoverflow.com/a/71416675/19092469 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-hibernate5</artifactId>
</dependency>
<!-- Réduire code répétitif et source d'erreur (reduce boilerplate) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Réduire code répétitif et source d'erreur (reduce boilerplate) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
how to resolve it ?
Using Spring boot 3, nothing special in properties.
Thanks