我正在利用业余时间从事一个项目,在这个项目上我被要求使用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);
}
}
Configuration.java
@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());
}
}
如果主题中缺少某些信息,请随时询问更多信息。我会尽快回答。
答案 0 :(得分:3)
首先,您要为@ComponentScan
的Application类中的程序包设置错误。
@ComponentScan("com.gambinomafia")
@SpringBootApplication
根据图片,它必须是:
@ComponentScan("com.project.example")
@SpringBootApplication
编辑:@ M.Deinum使用@ComponentScan
因为应用程序类位于根包中,并且@SpringBootApplication
已包含@ComponentScan
,所以不需要声明@ComponentScan
。
第二,可以使用存储库来代替使用DAO。这里有更多信息:Spring Boot Repositories。
第三,要注入对象,可以在构造函数上使用@Autowired
。
@Controller
public class VerverController
private VerverDao ververDao;
@Autowired
public VerverController(VerverDao ververDao) {
this.ververDao = ververDao;
}
}
还有更多信息here。
答案 1 :(得分:1)
日志清楚地说
VerverController需要找不到类型为'com.project.example.dao.VerverDao'的bean。
这意味着没有<label class="control-label pull-right" style="margin-right: 10px; font-weight: 100;">
<small>Show</small>
<select class="input-sm grid-per-pager" name="per-page">
<option value="https://www.mysite-com/admin/order?per_page=10" >10</option>
<option value="https://www.mysite-com/admin/order?per_page=20" selected>20</option>
<option value="https://www.mysite-com/admin/order?per_page=30" >30</option>
<option value="https://www.mysite-com/admin/order?per_page=50" >50</option>
<option value="https://www.mysited-com/admin/order?per_page=100" >100</option>
</select>
<small>Piece</small>
</label>
类型的bean
在com.project.example.dao.VerverDao
顶部添加@Repository
,以解决此问题。
VerverDao
注意:根据您的包装结构,确保VerverDao在组件扫描路径中。