我正在做一个简单的博客后端,作为一个个人项目。我这样做是为了尝试获取一些JavaSpring,我对下面的代码有问题(有很多...)。
我得到的错误正是这样的:定义为null的bean“postRepository”无法注册。已在null中定义了具有该名称的bean,并且已禁用重写。
代码本身在最初使用Hibernate时运行良好,我有2个DAO,2个DAOMPLS,并使用服务类中的DAOMPLS调用DB和back。一切都按预期工作-可以返回完整的用户列表、可以返回完整的帖子列表、单个用户/帖子等。所有crud操作。
如果我理解正确,要切换到Spring Data JPA,我所需要的就是摆脱DAO
和DAO实现
,并且每个实体只有一个扩展JpaRepository的接口
后类:
package com.me.website.entity;
@Entity
@Table(name="posts")
public class Post {
//fields of the Post object
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private int id;
@Column(name="title")
private String title;
@Column(name="author")
private String author;
@Column(name="date")
private LocalDateTime date;
@Column(name="excerpt")
private String excerpt;
@Column(name="featured_media")
private byte[] featuredMedia;
@Column(name="content")
private String content;
@Column(name="category")
private String category;
//constructor for the Post object
public Post(String title, String author, LocalDateTime date, String excerpt, byte[] featuredMedia, String content, String category) {
this.title = title;
this.author = author;
this.date = date;
this.excerpt = excerpt;
this.featuredMedia = featuredMedia;
this.content = content;
this.category = category;
}
public Post() {}
@Override
public String toString() {
return "Post{" +
"id=" + id +
", title='" + title + '\'' +
", author=" + author +
", date=" + date +
", excerpt='" + excerpt + '\'' +
", featuredMedia=" + Arrays.toString(featuredMedia) +
", content='" + content + '\'' +
", category='" + category + '\'' +
'}';
}
//getters and setters
用户类
package com.me.website.entity;
@Entity
@Table(name="users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Integer id;
@Column(name="username")
private String username;
@Column(name="display_name")
private String displayName;
@Column(name="first_name")
private String firstName;
@Column(name="last_name")
private String lastName;
@Column(name="email")
private String email;
@Column(name="password")
private String password;
public User() {}
public User(String username, String displayName, String firstName, String lastName, String email, String password) {
this.username = username;
this.displayName = displayName;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", displayName='" + displayName + '\'' +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
'}';
}
//getters and setters
使用Spring数据JPA的DAO
package com.me.website.dao;
public interface PostRepository extends JpaRepository<Post, Integer> {
//no implementation required
}
package com.psyonik.website.dao;
public interface UserRepository extends JpaRepository<User, Integer> {
//no implementation required
}
帖子/用户服务
package com.me.website.service;
public interface PostService {
public List<Post> findAll();
public Post findById(int theId);
public void save(Post thePost);
public void deleteById(int theId);
}
package com.me.website.service;
public interface UserService {
public List<User> findAll();
public User findById(int theId);
public void save(User theUser);
public void deleteById(int theId);
}
服务实现
package com.me.website.service;
@Service
public class PostServiceImpl implements PostService {
private PostRepository postRepository;
@Autowired
public PostServiceImpl(PostRepository thePostRepository) {
postRepository=thePostRepository;
}
@Override
public List<Post> findAll() {
return postRepository.findAll();
}
@Override
public Post findById(int theId) {
Post thePost = null;
Optional<Post> byId = postRepository.findById(theId);
if (byId.isPresent()) {
thePost = byId.get();
}
return thePost;
}
@Override
public void save(Post thePost) {
postRepository.save(thePost);
}
@Override
public void deleteById(int theId) {
postRepository.deleteById(theId);
}
}
package com.me.website.service;
@Service
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public List<User> findAll() {
return userRepository.findAll();
}
@Override
public User findById(int theId) {
User theUser = null;
Optional<User> thisUser = userRepository.findById(theId);
if (thisUser.isPresent()) {
theUser = thisUser.get();
}
return theUser;
}
@Override
public void save(User theUser) {
userRepository.save(theUser);
}
@Override
public void deleteById(int theId) {
userRepository.deleteById(theId);
}
}
POST Rest控制器
package com.me.website.restcontroller;
@RestController
@RequestMapping("/")
public class PostRESTController {
private PostService postService;
@Autowired
public PostRESTController(PostService thePostService) {
postService = thePostService;
}
/*GET mapping - this one returns a list of all the posts =========================================================*/
@GetMapping("/blog")
public List<Post> findAll() {
return postService.findAll();
}
/*GET mapping - this provides a pathvariable for a postId to retrieve a particular post item or return an error ==*/
@GetMapping("/blog/{postId}")
public Post findById(@PathVariable int postId) {
Post post = postService.findById(postId);
if (post == null) {
throw new RuntimeException("Post not found " + postId);
}
else return post;
}
/*POST mapping - this creates a new blogpost object and saving it to the db ======================================*/
@PostMapping("/blog")
public Post addPost(@RequestBody Post thePost) {
//in case an id is passed, this will be converted to 0 to force an insert instead of an update
thePost.setId(0);
postService.save(thePost);
return thePost;
}
/*PUT mapping - this updates a given blog post given the id passed through =======================================*/
@PutMapping("/blog")
public Post updatePost(@RequestBody Post thePost) {
postService.savePost(thePost);
return thePost;
}
/*DELETE mapping - this is to delete a specific blog post item ===================================================*/
@DeleteMapping("/blog/{blogId}")
public String deletePost(@PathVariable int blogId) {
//retrieve the correct post
Post thePost = postService.findById(blogId);
//throw exception if null
if (thePost == null) {
throw new RuntimeException("This post doesn't exist in db. Post ID: " + blogId);
}
else {
postService.deleteById(blogId);
}
return "Deleted post with id: " + blogId;
}
}
package com.me.website;
@SpringBootApplication
public class WebsiteApplication {
public static void main(String[] args) {
SpringApplication.run(WebsiteApplication.class, args);
}
}
我已经删除了进口声明,因为一切看起来都很好...
我只是不明白为什么会这样。我在想,也许spring bean工厂正在尝试制作不止一个post repository bean,但没有理由这么做。。。
我想我可能只是错过了配置(但事实并非如此,因为spring boot项目的主要方法有SpringBootApplication,它解决了所有这些问题)。
然后我想我需要在
JpaRepository
接口上添加@Transactional
,但如果我从Spring Boot Data留档中正确理解了这一点,情况也不是这样...我需要为两个JpaRepository接口设置bean name属性吗?
如果是这样,为什么?:)构造函数不会使用不同的类名称(PostRepository vs UserRepository)吗?
这两个建议都没有帮助,正如我之前提到的,现在也进行了研究,您实际上不需要@Repository
或使用@EnableJpaRepositories("package.name")
作为@SpringBootApplication
为您执行所有扫描,只要您的存储库在同一个包中。如果您在一个包中为一个实体提供一个存储库,而在另一个包中为另一个实体和另一个存储库提供另一个包,则需要使用此限定符来确保正确扫描包。
这个修复实际上是完全不直观的——我的pom.xml仍然引用了导致问题的spring-boot-starter-data-jdbc
。评论出来后,这个问题得到了解决。
对于任何想看到第一个版本与编辑版本之间差异的人,可以在此处查看我的github。数据库是MySQL,它的设置有两个表,一个叫做post,另一个叫做user,在本地运行。希望这对将来的人有帮助:)谢谢你的回答。
问题内容: 我已经将Spring Boot版本从2.0.3更新到2.1.1,但是我得到了: 我得到了错误-问题是在哪里看并不是一个好的指针。我已经看到了这个问题,但是我实际上更愿意继续禁止覆盖不明确的豆类。 有任何想法吗? 日志输出 问题答案: 好的,我自己发现了这个问题:我在项目中有两次: 和 所以我想说这是一个很好的Spring Boot新功能。 如果您看到这种错误,只需小心不要重复的注释。
问题内容: 我目前正在创建一个有趣的python线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示: 但是,当我尝试导入它时,它吐出一个。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。 我想知道的是: 我已经在该文件中按字面值定义了该类。为什么说未定义名称? 如何定义可用于注释的方式(作为)? 问题答案: 您有一份前瞻性声明;函数(作为方法
问题内容: 感谢您支持在本地运行该程序包。 现在在本地运行firstapp时遇到异常。 我添加 ,但仅遇到相同的问题。 请建议我必须设置哪些值 问题答案: 您需要按照错误消息的指示将其作为环境变量提供给本地容器。为此,请向环境变量提供相应的参数,就像将真实的XSUAA实例绑定到您的CloudFoundry微服务时一样。对于本地部署,您必须至少具有以下参数,其中该属性需要与JWT的签名匹配。此外,该
问题内容: 我知道在大多数编程方案中,当元素为0时,首选是将空集合改为空集合。但是,大多数使用JSON的语言(例如JavaScript)会将空列表/对象视为true,将空列表/对象视为false。例如,这既是true也是JavaScript中的对象: 但这也是事实: 这是错误的: 是否有关于JSON的空对象/列表的约定?而数字,布尔值和字符串呢? 问题答案: 如果期望的返回类型是数组,则返回一个空
问题内容: 我正在尝试在python3中编写一个简单的递归函数。在学习OO Java时,我还想编写涉及对象的Python代码。这是我的下面的代码。我提示用户输入一个数字,屏幕应该显示每个小到5的整数。 但是,当我在终端上运行它时,它说:“ NameError:未定义名称’recursive’”。错误如下所示: 是什么导致问题出在这里?我知道如何编写递归函数,给它一个参数,然后使其在终端上运行。但是