spring启动jpa按自定义字符串字段查找

sqserrrh  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(448)

我试图得到一个基于自定义字符串字段的模型列表。在user类中,我要搜索数据库并检索包含特定 role 价值观。
模型类

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id; 

    private String role;
    ...

}

存储库类

@Repository
public interface UserRepository extends JpaRepository<User, Long>{
    List<User> findById(@Param(value = "id") Long id);
    List<User> findByRole(@Param(value = "role") String role);
}

服务等级

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public List<User> findUserById(@PathVariable("id") Long id){
        return userRepository.findById(id);
    }

    public List<User> findUserByRole(String role){
        return userRepository.findByRole(role);
    }
    ...
}

控制器类

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping
    public List<User> accessUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public List<User> findById(@PathVariable("id") Long id){
        return userService.findUserById(id);
    }

    @GetMapping("/{role}")
    public List<User> findByRole(@RequestParam(value="role") String role){
        return userService.findUserByRole(role);
    }
    ...
}

我提出如下请求(其中role=manager):

GET localhost:8080/api/users/MANAGER

但是,我得到了这个错误。我注意到,如果我尝试基于长id值获取模型,它是有效的,但是每当我尝试使用字符串字段时,它都会给出错误:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Ambiguous handler methods mapped for '/api/users/CHEF': {public java.util.Optional com.cs322.ors.controller.UserController.accessUserInfo(long,org.springframework.security.core.Authentication), public java.util.List com.cs322.ors.controller.UserController.findByRole(java.lang.String)}

我尝试了以下链接,但问题仍然存在:
Spring Boot模糊处理程序
使用spring处理rest应用程序中Map的不明确处理程序方法

w9apscun

w9apscun1#

一个朋友帮我解决了这个问题。
在绘制路线图时 GET localhost:8080/api/users/MANAGER ,spring boot不知道我是否在指定 GET localhost:8080/api/users/{id} 或者 GET localhost:8080/api/users/{role} . 由于他们有相同的网址,它不能决定两者之间的区别 id 以及 role . 为了解决这个问题,我添加了一个更具体的端点,如下所示:

@GetMapping("roles/{role}")
    public List<User> findByRole(@PathVariable("role") String role){
        return userService.findUserByRole(role);
    }

相关问题