1
votes

Impossible d'obtenir le nom d'utilisateur dans Spring Boot

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:

entrez la description de l'image ici

Et quand j'obtiens l'utilisateur de name (l'url: localhost / u / {username} ):

 entrez la description de l'image ici

Je m'assure que le nom saisi à partir de l'URL est correct.


0 commentaires

4 Réponses :


2
votes

vous avez des mappages en double dans votre UserController pour le chemin / u / {name} . getUserById et getUsernameAndPasswordByName ont les mêmes points de terminaison.


0 commentaires

2
votes

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}") .


0 commentaires

2
votes

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}")


2 commentaires

donc j'ai l'URL comme: / u / find-by-id / {id} et / u / {name} `non?


@HarryCoder Oui; exactement



2
votes

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)


0 commentaires