Java 使用参数从JPA中的get获取单用户数据将导致ConverterNotFoundException
我想用JPA在H2数据库中获得一个用户,但是当我调用我的方法时,我得到一个Java 使用参数从JPA中的get获取单用户数据将导致ConverterNotFoundException,java,spring-boot,jpa,Java,Spring Boot,Jpa,我想用JPA在H2数据库中获得一个用户,但是当我调用我的方法时,我得到一个ConverterNotFoundException。如何根据get上传入的参数字符串(电子邮件)获取单个用户 我的控制器: @GetMapping("/{email}") public UserDTO getUser(@PathVariable String email) { return userService.getByEmail(email); } 我的用户服
ConverterNotFoundException
。如何根据get上传入的参数字符串(电子邮件)获取单个用户
我的控制器:
@GetMapping("/{email}")
public UserDTO getUser(@PathVariable String email) {
return userService.getByEmail(email);
}
我的用户服务(get-on ID有效):
我的用户存储库:
public interface UserRepository extends JpaRepository<User, Long> {
// add custom queries here
// tried this one but same problem
@Query("select r from User r where r.email = :email")
UserDTO findOneByMail(@Param("email") String searchTerm);
UserDTO findByEmail(String email);
}
public interface UserRepository扩展了JpaRepository{
//在此处添加自定义查询
//我试过这个,但问题是一样的
@查询(“从用户r中选择r,其中r.email=:email”)
UserDTO findOneByMail(@Param(“email”)字符串搜索词);
用户dto findByEmail(字符串电子邮件);
}
存储库中的以下方法将返回数据类型为User
的对象,并且不知道如何将其自动转换为UserDTO
:
@Query(“从用户r中选择r,其中r.email=:email”)
UserDTO findOneByMail(@Param(“email”)字符串搜索词);
相反,您需要将存储库更改为以下内容:
public interface UserRepository扩展了JpaRepository{
//在此处添加自定义查询
//我试过这个,但问题是一样的
@查询(“从用户r中选择r,其中r.email=:email”)
用户findOneByMail(@Param(“email”)字符串searchTerm);
用户findByEmail(字符串电子邮件);
}
您可以将服务功能更改为以下内容:
public UserDTO getByEmail(字符串电子邮件){
返回converttoto(userRepository.findByEmail(email));
}
私有用户DTO CONVERTODTO(用户用户){
UserDTO UserDTO=新UserDTO();
userDto.setName(user.getName());
//为UserDTO中需要的所有属性编写此代码
返回userDto;
}
存储库是您与数据库的连接。它只存储数据类型
User
,这是它可以返回的。将该数据转换为UserDTO
的所有业务逻辑都必须在您的服务层中完成。存储库中的以下方法将返回数据类型为User
的对象,并且不知道如何将其自动转换为UserDTO
:
@Query(“从用户r中选择r,其中r.email=:email”)
UserDTO findOneByMail(@Param(“email”)字符串搜索词);
相反,您需要将存储库更改为以下内容:
public interface UserRepository扩展了JpaRepository{
//在此处添加自定义查询
//我试过这个,但问题是一样的
@查询(“从用户r中选择r,其中r.email=:email”)
用户findOneByMail(@Param(“email”)字符串searchTerm);
用户findByEmail(字符串电子邮件);
}
您可以将服务功能更改为以下内容:
public UserDTO getByEmail(字符串电子邮件){
返回converttoto(userRepository.findByEmail(email));
}
私有用户DTO CONVERTODTO(用户用户){
UserDTO UserDTO=新UserDTO();
userDto.setName(user.getName());
//为UserDTO中需要的所有属性编写此代码
返回userDto;
}
存储库是您与数据库的连接。它只存储数据类型
User
,这是它可以返回的。将该数据转换为UserDTO
的所有业务逻辑都必须在您的服务层中完成。您的问题是您的存储库从User
对象扩展而来,但您的查询正试图解析为UserDTO
对象。这就是为什么会出现异常,因为您没有实现将User
解析为UserDTO
的方法
在这里,有两种选择
- 第一个选项:只需从
扩展存储库即可
DTO
not应该是一个实体
- 第二个选项:实现从
到User
的解析UserDTO
public UserDTO getByEmail(字符串电子邮件){
返回新的UserDTO(userRepository.findByEmail(email));
}
还有你的类UserDTO.java
public UserDTO(User user){
name = user.getName()
...
}
有更多的方法(最终是使用其他对象属性创建一个新对象),但我使用它来创建
dto
对象。您的问题是您的存储库从用户
对象扩展而来,但您的查询正试图解析为用户dto
对象。这就是为什么会出现异常,因为您没有实现将User
解析为UserDTO
的方法
在这里,有两种选择
- 第一个选项:只需从
扩展存储库即可
DTO
not应该是一个实体
- 第二个选项:实现从
到User
的解析UserDTO
public UserDTO getByEmail(字符串电子邮件){
返回新的UserDTO(userRepository.findByEmail(email));
}
还有你的类UserDTO.java
public UserDTO(User user){
name = user.getName()
...
}
有更多的方法(最终是使用其他对象属性创建一个新对象),但我使用它来创建
dto
对象。您的查询应该返回一个User
对象,并解析到UserDTO
到服务中。(我假设DTO不是一个实体)您的查询应该返回一个User
对象,并解析到UserDTO
到服务中。(我假设DTO不是一个实体)