[英]Spring Boot: Consider defining a bean named 'entityManagerFactory' in your configuration
[英]Spring Boot defining bean in configuration problem
我正在利用业余时间从事一个项目,我被要求在这个项目上使用Spring Boot。 我以前并不熟悉Spring Boot,我曾尝试在此处搜索stackoverflow和Google,但似乎无法理解针对我的问题的不同解决方案的工作方式。
首先,这是我的错误信息:
com.project.example.controller.VerverController中的构造函数的参数0需要找不到“ com.project.example.dao.VerverDao”类型的Bean。
行动:
考虑在配置中定义类型为“ com.project.example.dao.VerverDao”的bean。
经过一番阅读后,我了解到这可能是因为Spring Boot不扫描此类/接口。 所以我尝试添加ComponentScan,但是没有运气。
我试图将VerverDao从接口转换为类,并使用bean注解注册一个bean。 仍然没有运气。 我试图将VerverDao从dao包移到根包(与Main类相同),但还是没有运气。
因此,如果有人可以帮助我理解错误消息,那将使我感到高兴。
这是我的结构:
这是我的代码:
可能有些注释也是错误的,因为我不习惯使用Spring Boot,所以在此先感谢您对我的使用进行了更正。还值得一提的是,我在该项目中也使用了Lombok。
Main.java
@ComponentScan("com.gambinomafia")
@SpringBootApplication
public class Main extends SpringBootServletInitializer {
public static void main(String[] args) {
new Main().configure(new SpringApplicationBuilder(Main.class)).run(args);
}
}
配置文件
@Component
public class Configuration extends ResourceConfig {
public Configuration() {
register(VerverResourceImpl.class, VerverResource.class);
register(VerverController.class);
register(VerverDao.class);
}
}
VerverResource.java
@Resource
@Path("verver")
public interface VerverResource {
@GET
@Path("/{userid}")
@Produces(MediaType.APPLICATION_JSON)
String getRefferingUrl(@PathParam("userid") int userid);
}
VerverResourceImpl.java
@AllArgsConstructor(onConstructor = @__({@Inject}))
public class VerverResourceImpl implements VerverResource {
private VerverController controller;
@Override
public String getRefferingUrl(int userid) {
log.info("Collection reciever url for user id: {}", userid);
return controller.getRefferingUrl(userid);
}
}
VerverController.java
@Controller
@AllArgsConstructor
public class VerverController {
private VerverDao ververDao;
public String getRefferingUrl(int userid) {
User user = ververDao.getUsername(userid);
if (user.getUsername().isEmpty()) {
throw new NotFoundException("Did not find any user with id " + userid);
}
return "<url-to-site>/?verv=" + user.getUsername();
}
}
VerverDao.java
@AllArgsConstructor
public class VerverDao {
@Value("spring.datasource.url")
private String dbcon;
public User getUsername(int userid) {
Jdbi jdbi = Jdbi.create(dbcon);
return jdbi.withHandle(handle -> handle.createQuery(
"SELECT id, brukernavn FROM t_user WHERE id = :id")
.bind("id", userid)
.mapToBean(User.class)
.findOnly());
}
}
如果主题中缺少某些信息,请随时询问更多信息。 我会尽快回答。
首先,要在Application类中使用错误的程序包设置@ComponentScan
。
@ComponentScan("com.gambinomafia")
@SpringBootApplication
并且,根据图片,它必须是:
@ComponentScan("com.project.example")
@SpringBootApplication
编辑:@ M.Deinum使用@ComponentScan
由于Application类位于根包中,并且@SpringBootApplication
已经包含@ComponentScan
,因此不需要声明@ComponentScan
。
其次,可以使用存储库来代替使用DAO。 这里有更多信息: Spring Boot存储库 。
第三,要注入对象,可以在构造函数上使用@Autowired
。
@Controller
public class VerverController
private VerverDao ververDao;
@Autowired
public VerverController(VerverDao ververDao) {
this.ververDao = ververDao;
}
}
有更多的信息在这里 。
日志清楚地说
VerverController需要找不到类型为'com.project.example.dao.VerverDao'的bean。
这意味着没有com.project.example.dao.VerverDao
类型的com.project.example.dao.VerverDao
添加@Repository
之上VerverDao
来解决问题。
@Repository
@AllArgsConstructor
public class VerverDao {
}
注意 :根据您的包装结构,确保VerverDao在组件扫描路径中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.