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)