0

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

R Am
  • 11
  • 1
  • 2
  • Please don't ask [the same question](https://stackoverflow.com/questions/75518100/injection-in-custom-validator-return-null) again. Instead modify your original question if you have additional information. – M. Deinum Feb 22 '23 at 11:16
  • It's not the final solution but can give some tips... what happens if you add @Primary on top of the bean "LocalValidatorFactoryBean validator()"? – Matteo NNZ Feb 22 '23 at 11:26
  • If various beans are created, the bean which will "win" and give his value is bean which is annotated "@Primary". Is it? Thanks to your help, now I think I have to mark "@Primary" some bean but I don't know which. I tried with LocalValidatorFactoryBean (but nothing), I also tried to put my repository as a parameter in this bean as I saw in internet but nothing. Am I in a good way? I like tips, if you want to give me more.. Thank you Matteo – R Am Feb 22 '23 at 11:55
  • following Spring doc, I added in my config `@Bean public MethodValidationPostProcessor validationPostProcessor() { return new MethodValidationPostProcessor(); }` unfortunately still nothing – R Am Feb 22 '23 at 12:13

0 Answers0