2
votes

Spring Boot recherche les données entre deux dates

Je voudrais rechercher des données entre deux dates voici mon référentiel

Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDate] for value '27/11/2015'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [27/11/2015]",

et voici mon contrôleur

http://localhost:8080/api/movement/movementsByDate?dateBefore=27/11/2015&dateAfter=03/01/2019&page=0&size=9

Maintenant mon problème c'est quand je teste ce webservice avec cette URL:

@RequestMapping(value="/movementsByDate", method = RequestMethod.GET)
public Page<Mouvements> movementsByDate(
        @RequestParam(name= "dateBefore", defaultValue="")LocalDate dateBefore, 
        @RequestParam(name= "dateAfter", defaultValue="")LocalDate dateAfter, 
        @RequestParam(name= "page", defaultValue="0")int page, 
        @RequestParam(name= "size", defaultValue="5")int size){
    return mouvementsRepository.getMouvementsByDate(dateBefore, dateAfter, new PageRequest(page, size));
}

J'ai cette erreur

@Query("select mvt from Mouvements mvt where mvt.dateCompte between :x and :y")
public Page<Mouvements> getMouvementsByDate(@Param("x")LocalDate dateBefore, @Param("y")LocalDate dateAfter, Pageable pageable); 


0 commentaires

4 Réponses :


1
votes

Dans Spring Boot, le format de conversion par défaut LocalDate est aaaa-MM-jj et vous utilisez 27/11/2015 qui est jj / MM / aaaa .

Utilisez @DateTimeFormat pour spécifier votre propre format pour les paramètres de mappage de requête ou utiliser le format par défaut dans la requête. Notez que le caractère / doit être encodé comme % 2F lorsqu'il fait partie de l'URL, votre exemple n'est pas valide, il serait donc plus facile d'utiliser la norme 2015-11 -27 .

Spring devrait prendre en charge le mappage facultatif donc ci-dessous devrait fonctionner:

@RequestParam(name = "dateBefore")
@DateTimeFormat(iso = ISO.DATE)
Optional<LocalDate> dateBefore


1 commentaires

J'ai la même erreur lorsque j'utilise le format par défaut aaaa-MM-jj dans l'url http: // localhost: 8080 / api / movement / movesByDate? dateBefor‌ e = 2015-11-20 & dateAft‌ er = 2019- 01-03 & page = 0‌ & size = 9



0
votes

Vous devez le faire comme ceci

public class StringToLocalDateConverter implements Converter<String, LocalDate> {
    public LocalDateTime convert(String source) {
        DateTimeFormatter formatter = DateTimeFormatter.BASIC_ISO_DATE;
        return LocalDate.parse(source, formatter);
    }
}

Si vous voulez faire ce type de conversion globalement, vous pouvez utiliser une classe Spring Converter

@RequestMapping(value="/movementsByDate", method = RequestMethod.GET)
public Page<Mouvements> movementsByDate(
        @RequestParam(name= "dateBefore", defaultValue="") @DateTimeFormat(iso = ISO.DATE) LocalDate dateBefore, 
        @RequestParam(name= "dateAfter", defaultValue="") @DateTimeFormat(iso = ISO.DATE) LocalDate dateAfter, 
        @RequestParam(name= "page", defaultValue="0")int page, 
        @RequestParam(name= "size", defaultValue="5")int size){
    return mouvementsRepository.getMouvementsByDate(dateBefore, dateAfter, new PageRequest(page, size));
}


0 commentaires

1
votes

Vous pouvez modifier le format de la LocalDate globalement:

@InitBinder
public void localDateBind(WebDataBinder binder) {
     binder.registerCustomEditor(LocalDate.class, new PropertyEditorSupport() {
          @Override
          public void setAsText(String text) throws IllegalArgumentException {
            LocalDate.parse(text, DateTimeFormatter.ISO_DATE); //CUSTOM FORMAT
          }
     });
}


0 commentaires

1
votes

Il est préférable que vous receviez les paramètres sous forme de chaîne, puis que vous convertissiez la chaîne en LocalDate dans votre contrôleur.

@RequestMapping(value="/movementsByDate", method = RequestMethod.GET)
public Page<Mouvements> movementsByDate(
        @RequestParam(name= "dateBefore", defaultValue="")String dateBeforeString, 
        @RequestParam(name= "dateAfter", defaultValue="")String dateAfterString, 
        @RequestParam(name= "page", defaultValue="0")int page, 
        @RequestParam(name= "size", defaultValue="5")int size){

        LocalDate dateBefore = LocalDate.parse(dateBeforeString, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
        LocalDate dateAfter = LocalDate.parse(dateAfterString, DateTimeFormatter.ofPattern("dd/MM/yyyy"));

    return mouvementsRepository.getMouvementsByDate(dateBefore, dateAfter, new PageRequest(page, size));
}


0 commentaires