【问题标题】:spring boot rest JPA query return null object on Query by emailspring boot rest JPA 查询在通过电子邮件查询时返回空对象
【发布时间】:2017-08-18 23:02:55
【问题描述】:

我在 Spring Boot 应用程序中遇到了 Spring Data Rest 的不同行为 当我从对象存储库类查询时,具有自定义查询以通过匹配电子邮件 ID 来检索用户对象,并且电子邮件 ID 是唯一的。我得到空值并且对象存在。 我正在从邮递员那里调用 Rest URI。 --UserRepository

@Repository
@Transactional
public interface UserRepository extends  JpaRepository<User, Long> {    

    @Query(value ="select u from User u where u.email = :email")
    User findByEmail(@Param("email") String email);


}

--UserServiceImpl

@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService{

    @Autowired
    private UserRepository userRepository;


    @Override
    public User findByEmail(String email) {
        return userRepository.findByEmail(email);
    }
}

--控制器

@RestController
@RequestMapping("/api")
public class UserControllerRest {

@Autowired(required = true)
UserServiceImpl userService;    
@RequestMapping(value = "/user/email/{email}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
            public ResponseEntity<User> getUserByEmail(@PathVariable("email") String email) {
                System.out.println("Fetching User with id " + email);
                User user = userService.findByEmail(email);
                if (user == null) {
                    System.out.println("User with email " + email + " not found");
                    return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
                }
                return new ResponseEntity<User>(user, HttpStatus.OK);
            }

}

这方面需要帮助

【问题讨论】:

  • 我们能提供什么帮助?您只需要开始调试:您传递给查询的电子邮件是否是您认为的电子邮件(没有尾随或前导空格等)?电子邮件是否真的存在于表中?插入它的事务是否已提交?您确定该应用程序使用您认为它正在使用的数据库或架构吗?它适用于另一个现有的电子邮件吗?在代码中添加跟踪。使用您的调试器。我们在这里无能为力。
  • 是的电子邮件存在于 db 中,我还检查了 trim ,当我尝试获取对象列表时,它向我显示具有电子邮件 ID 的特定对象,但是当我尝试作为单个对象检索时,我是拿不到。
  • 我在 sql 查询中检查了类似的条件,它返回数据,可能是前导空格的问题。 @Query(value = "select firstName,lastName from User u where u.email like %:email%") ,但类似条件不是必需的,因为它会返回对象列表
  • 我应该在哪里添加对要忽略的前导空格的检查,我尝试修剪电子邮件的参数字符串,但在处理 user = userService.findByEmail(email.toString().trim() 时出现异常异常:"java.lang.IllegalArgumentException: 参数绑定的名称不能为空或空!对于命名参数,您需要使用@Param 查询 Java 版本
  • 明确一点:如果您将方法签名更改为List&lt;User&gt; findByEmail(@Param("email") String email),是否一切正常。如果没有,您是否在修剪后使用不同的电子邮件地址进行了尝试。

标签: spring hibernate spring-boot spring-data spring-data-jpa


【解决方案1】:

请添加更多详细信息。将项目添加到 GitHub 或其他东西。你的用户模型是什么样的?您注入服务实现而不是 IUserService,也许这就是问题所在。

【讨论】:

  • 我已经修复了服务注入,通过用 IUserService 替换服务实现
【解决方案2】:

经过大量调试后,我终于发现电子邮件 ID 无法到达控制器映射方法,对于 test@gmail.com,它被读取为 test@gmail,并且删除了句点和 com 值,解决方法是更改​​ URI 映射并在参数末尾添加 /,因此更新后的 URI 现在是
@RequestMapping(value = "/user/email/{email}/",produces = MediaType.APPLICATION_JSON_VALUE)

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 2020-06-20
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2021-12-27
    • 2020-03-29
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多