JPA调用save方法报类型参数S超出边界需继承Post错误如何解决
问题原因
Inferred type 'S' for type parameter 'S' is not within its bound; should extend 'com.carepay.assignment.domain.Post'
这个报错的核心原因是:
- 你定义的
PostRepository继承了JpaRepository<Post, Long>,它的save方法只能接收Post实体类的实例作为参数,你当前直接把接收请求的DTOCreatePostRequest传入save方法,类型不匹配。 - 此外你
createPost方法要求返回PostDetails类型,但你当前代码返回的是CreatePostRequest类型,也存在类型不兼容问题。
修复方案
你需要在业务层做两次对象转换:请求DTO转实体类,存储后的实体类转响应DTO,修改后的PostServiceImpl代码如下:
@Service public class PostServiceImpl implements PostService { @Autowired private PostRepository postRepository; @Override public PostDetails createPost(@Valid CreatePostRequest createPostRequest) { // 1. 把请求DTO转换为JPA要求的Post实体 Post post = new Post(); post.setTitle(createPostRequest.getTitle()); post.setContent(createPostRequest.getContent()); // 2. 保存Post实体到数据库,拿到带自增id的持久化对象 Post savedPost = postRepository.save(post); // 3. 把保存后的实体转换为返回要求的PostDetails对象 PostDetails postDetails = new PostDetails(); postDetails.setId(savedPost.getId()); postDetails.setTitle(savedPost.getTitle()); postDetails.setContent(savedPost.getContent()); return postDetails; } // 其他原有方法保持不变 }
注意事项
- 请确保
CreatePostRequest、Post、PostDetails三个类都已经生成了对应字段的getter、setter方法,你也可以引入Lombok的@Data注解自动生成,避免手动写get/set的冗余代码。 - 如果项目里有MapStruct之类的对象转换工具,也可以用工具类完成上述对象转换,简化代码。
内容的提问来源于stack exchange,提问作者Karanja
相关产品推荐
相关产品推荐

