Java 使用参数从JPA中的get获取单用户数据将导致ConverterNotFoundException

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); } 我的用户服

我想用JPA在H2数据库中获得一个用户,但是当我调用我的方法时,我得到一个
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不是一个实体)