Le problème est: lorsque j'utilise JpaRepository et que j'utilise une méthode pour obtenir l'utilisateur par nom d'utilisateur comme le code ci-dessous:
@RestController @RequestMapping("/u") public class UserController { @Autowired private UserRepository repo; .... @GetMapping("/{name}") public ResponseEntity<User> getUsernameAndPasswordByName(@PathVariable("name") String name) { User user = repo.findUserByName(name); if(user == null) { return new ResponseEntity(HttpStatus.BAD_REQUEST); } return new ResponseEntity<User>(user, HttpStatus.OK); } }
Voici l'entité:
@Entity @Table(name = "users") @Data public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(name = "username", nullable = false, unique = true) private String username; @Temporal(TemporalType.TIMESTAMP) @Column(name = "joined_date", nullable = false, unique = true) @CreatedDate private Date joinedDate; @Column(name = "password") private String password; @Column(name = "bio") private String bio; @Column(name = "email", nullable = false, unique = true) private String email; }
Et voici le contrôleur:
public interface UserRepository extends JpaRepository<User, Integer> { @Query(value = "select * from users where username = :name", nativeQuery = true) User findUserByName(@Param("name") String name); }
Ce sont les données complètes de JSON tout en récupérant tous les utilisateurs de DB:
Et quand j'obtiens l'utilisateur de name (l'url: localhost / u / {username}
):
Je m'assure que le nom saisi à partir de l'URL est correct.
4 Réponses :
vous avez des mappages en double dans votre UserController
pour le chemin / u / {name}
. getUserById
et getUsernameAndPasswordByName
ont les mêmes points de terminaison.
L'erreur indique que vous avez mappé deux méthodes RestController avec un chemin similaire:
getUsernameAndPasswordByName
et getUserById
.
Essayez d'avoir différentes valeurs @GetMapping
, par exemple: @GetMapping ("/ name / {name}"), @GetMapping ("/ id / {id}") code>.
Vous avez deux méthodes avec le même mapping
@GetMapping("/find-by-id/{id}")
et ceci est ambigu pour spring; changez simplement l'un des mappages en quelque chose comme ceci:
1 - getUsernameAndPasswordByName(@PathVariable("name") String name) @GetMapping("/{name}") 2 - getUserById(@PathVariable("id") int id) @GetMapping("/{id}")
donc j'ai l'URL comme: / u / find-by-id / {id}
et / u / {name} `non?
@HarryCoder Oui; exactement
Spring n'est pas capable de faire la distinction entre getUsernameAndPasswordByName (String)
et getUserById (Integer)
car votre mappage est ambigu.
Essayez d'utiliser un paramètre de requête pour le getUsernameAndPasswordByName (String)
, elle sera plus appropriée comme -
getUsernameAndPasswordByName(@PathVariable("name") String name) //and getUserById(@PathVariable("id") int id)