Spring Data JPA findOne() changement d'Option comment l'utiliser?
Je suis en train d'apprendre SpringBoot2.0
avec Java8
.
Et j'ai suivi certains blog de prise de tutoriel.
Le tutoriel code source est:
@GetMapping("/{id}/edit")
public String edit(@PathVariable Long id, Model model) {
model.addAttribute("categoryDto", categoryService.findOne(id));
return "category/edit";
}
Mais ce code est de lancer cette erreur:
categoryService.findOne(id)
Je suis en train de penser à propos de la modification de la JPA findOne()
méthode pour Optional< S >
Comment résoudre ce problème?
Plus d'infos:
C'est le categoryService méthode:
public Category findOne(Long id) {
return categoryRepository.findOne(id);
}
1. pouvez-vous mettre le lien vers le blog u r suivant ou pouvez-vous montrer le code complet. Comment est categoryService declaredß 2. Qu'est-ce que l'exception que vous obtenez
OriginalL'auteur Hulk Choi | 2018-03-16
Vous devez vous connecter pour publier un commentaire.
Au moins, le
2.0
version,Spring-Data-Jpa
modifiéfindOne()
.Maintenant,
findOne()
ne pas avoir tous les deux la même signature et le même comportement.Auparavant, il a été défini dans le
CrudRepository
interface :Maintenant, le seul
findOne()
méthode que vous trouverez dansCrudRepository
qui est défini dans leQueryByExampleExecutor
interface :Qui est mis en œuvre, enfin, en
SimpleJpaRepository
, le défaut de mise en œuvre de laCrudRepository
interface.Cette méthode est un exemple de requête de recherche, et vous ne voulez pas que comme un remplacement.
En fait, la méthode avec le même comportement est toujours là, dans la nouvelle API, mais le nom de la méthode a changé.
Il a été renommé de
findOne()
àfindById()
dans leCrudRepository
interface :Maintenant, il renvoie un
Optional
. Ce qui n'est pas si mal pour éviterNullPointerException
.Donc, la méthode à appeler est maintenant
Optional<T> findById(ID id)
.Comment l'utiliser ?
L'apprentissage
Facultatif
d'utilisation.Ici l'information importante concernant ses spécifications :
Quelques conseils sur la façon d'utiliser
Optional
avecOptional<T> findById(ID id)
.Généralement que vous recherchez une entité par id que vous souhaitez retourner ou de faire un traitement particulier si ce n'est pas récupéré.
Ici trois classiques des exemples d'utilisation.
1) on Suppose que, si l'entité est trouvé que vous voulez obtenir, sinon vous voulez obtenir une valeur par défaut.
Vous pourriez écrire :
ou obtenir un
null
la valeur par défaut si elle a un sens (même comportement qu'avant l'API de modification) :2) on Suppose que, si l'entité est trouvé, vous voulez le retourner, sinon vous souhaitez lancer une exception.
Vous pourriez écrire :
3) Supposons que vous souhaitez appliquer un traitement différents selon si l'entité se trouve ou non (sans lancer une exception).
Vous pourriez écrire :
La première partie est faux: la méthode n'a pas été déplacé à
QueryByExampleExecutor
il a tout simplement été renomméfindById(…)
retour d'unOptional
. Aussi, toujours….map(…)
sur unOptional
, ne jamais appelerget()
.thnx davidxxx. Vous me sauver
Peut-être EntityNotFoundException plutôt que NotFoundEntity est mieux.
Convenus et mis à jour. En outre, il est défini dans la
javax.persistence
API comme unRuntimeException
. Donc fait vraiment de sens.OriginalL'auteur davidxxx
La méthode a été renommé
findById(…)
retour d'unOptional
de sorte que vous avez à gérer l'absence de vous-même:OriginalL'auteur Oliver Drotbohm
Optional
api fournit des méthodes pour obtenir les valeurs. Vous pouvez le vérifierisPresent()
pour la présence de la valeur et puis faire un appel àget()
ou vous pouvez faire un appel àget()
enchaîné avecorElse()
et de fournir une valeur par défaut.La dernière chose que vous pouvez essayer de faire est d'utiliser
@Query()
sur une méthode personnalisée.….get()
sur unOptional
est de mauvais conseils.Optional
a consacré des méthodes pour traiter la valeur.OriginalL'auteur Prashant
En effet, dans la dernière version de Printemps de Données, findOne renvoie une option. Si vous voulez récupérer l'objet de l'Option, vous pouvez simplement utiliser get() sur l'Option. Tout d'abord, un référentiel doit retourner l'option d'un service, qui gère ensuite le cas où l'option est vide. par la suite, le service doit renvoyer l'objet à l'automate.
….get()
sur unOptional
est de mauvais conseils.Optional
a consacré des méthodes pour traiter la valeur.en effet, pour des fins de gestion de la valeur, il y a de meilleures méthodes, telles que .orElse() ou .orElseThrow(). Mais pour simplement récupérer l'élément sans vérifier si le référentiel d'appel a renvoyé l'objet désiré, .get() devrait juste au sujet de le faire
OriginalL'auteur Claudiu Guja