【问题标题】:Cannot get username in spring boot在spring boot中无法获取用户名
【发布时间】:2019-02-11 15:26:58
【问题描述】:

问题是:当我使用 JpaRepository 并使用一种方法通过用户名获取用户时,如下代码:

public interface UserRepository extends JpaRepository<User, Integer> {

    @Query(value = "select * from users where username = :name", nativeQuery = true)
    User findUserByName(@Param("name") String name);
}

这是实体:

@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;
}   

这是控制器:

@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);
    }
}

这是从 DB 获取所有用户时 JSON 的全部数据:

当我从名称中获取用户时(网址:localhost/u/{username}):

我保证从 URL 输入的名称是正确的。

【问题讨论】:

    标签: java spring spring-boot jpa spring-boot-jpa


    【解决方案1】:

    您有两个具有相同映射的方法

    1 - getUsernameAndPasswordByName(@PathVariable("name") String name)
    @GetMapping("/{name}")
    2 - getUserById(@PathVariable("id") int id)
    @GetMapping("/{id}")
    

    这对于春天来说是模棱两可的; 只需将其中一个映射更改为如下所示:

    @GetMapping("/find-by-id/{id}")
    

    【讨论】:

    • 所以我有这样的网址:/u/find-by-id/{id} 和 /u/{name}` 对吗?
    • @HarryCoder 是的;正是
    【解决方案2】:

    您的UserController 中有路径/u/{name} 的重复映射。 getUserByIdgetUsernameAndPasswordByName 具有相同的端点。

    【讨论】:

      【解决方案3】:

      错误表明您已经映射了两个具有相似路径的 RestController 方法:

      getUsernameAndPasswordByNamegetUserById

      尝试使用不同的@GetMapping 值,例如:@GetMapping("/name/{name}"), @GetMapping("/id/{id}")

      【讨论】:

        【解决方案4】:

        Spring 无法区分 getUsernameAndPasswordByName(String)getUserById(Integer),因为您的映射不明确。

        尝试为getUsernameAndPasswordByName(String)方法使用查询参数,这样会更合适-

            getUsernameAndPasswordByName(@PathVariable("name") String name) 
        
            //and
        
            getUserById(@PathVariable("id") int id)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-15
          • 2018-10-25
          • 1970-01-01
          • 2018-01-25
          • 1970-01-01
          • 2016-11-03
          • 2018-09-06
          • 2017-11-03
          相关资源
          最近更新 更多