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);
4 Réponses :
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
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
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));
}
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
}
});
}
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));
}