【问题标题】:Jpa Repository save Inferred type 'S' for type parameter 'S' is not within its boundJpa 存储库保存类型参数“S”的推断类型“S”不在其范围内
【发布时间】:2018-06-06 14:08:36
【问题描述】:

我有实体用户

@Entity
@Data
public class User {

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

    private String username;

    private String password;

}

用户存储库

public interface UserRepository extends JpaRepository<UserRepository, Long> {
    User findByUsername(String username);
}

控制器

@RestController
@RequestMapping("/user")
public class UserController {

    private UserRepository userRepository;
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    public UserController(UserRepository userRepository, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userRepository = userRepository;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @PostMapping("/sign-up")
    public void signUp(@RequestBody User user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        userRepository.save(user);
    }
}

在 signUp 方法中的 UserController 类中,userRepository.save(user) 抛出错误推断类型参数“S”的类型“S”不在其范围内;应该实现'Repository.UserRepository

【问题讨论】:

  • 在 Controller 中使用 @Autowired 注释您的 userRepository。
  • 这不是错JpaRepository&lt;UserRepository, Long&gt;。你应该使用用户
  • 您的下一个错误将是NullPointerException
  • 我也遇到过类似的问题,它在存储库中,特别是您需要在 CrudRepository 中传递的类型,您需要传递域类,即User

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


【解决方案1】:

对于我来说,出现这个错误是因为新版spring boot中的save(list)方法不支持List of objects作为参数,所以我换成saveAll(list)所以xRepository.saveAll(list)

【讨论】:

  • 这个对我有用。谢谢
【解决方案2】:

新版本一般是2.0或更高版本有这个变化。他们限制了 Object 的 Save() 方法。要保存 List 类型的数据,我们必须使用 saveAll()

【讨论】:

    【解决方案3】:

    您的存储库接口声明不正确。

    改变

    public interface UserRepository extends JpaRepository<UserRepository, Long> 
    

    public interface UserRepository extends JpaRepository<User, Long> 
    

    【讨论】:

    • 如果第二个解决方案不起作用处理它返回 customRepository.findById(id).orElse(null);
    【解决方案4】:

    原因:廖老师的spring boot使用的是1.4.1.RELEASE,新版本一般是2.0以上。 解决方法:替换 findOne 方法

    return repo.findById(id).orElse(null);
    

    【讨论】:

      【解决方案5】:

      以下是另一个可行的解决方案

      return customRepository.findById(id).orElse(null);

      【讨论】:

        【解决方案6】:

        在存储库接口中创建保存方法

        void save(List&lt;? extends User&gt; user);

        【讨论】:

          猜你喜欢
          • 2019-03-25
          • 1970-01-01
          • 2019-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-13
          • 2011-05-24
          • 1970-01-01
          相关资源
          最近更新 更多