Spring Boot在配置问题中定义bean

时间:2018-10-28 02:56:53

标签: java spring spring-boot

我正在利用业余时间从事一个项目,在这个项目上我被要求使用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类相同),但还是没有运气。

因此,如果有人可以帮助我理解错误消息,那将使我高兴。

这是我的结构:

project structure

这是我的代码:

一些注释可能也是错误的,因为我不习惯使用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());
    }
}

如果主题中缺少某些信息,请随时询问更多信息。我会尽快回答。

2 个答案:

答案 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>&nbsp; <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> &nbsp;<small>Piece</small> </label>类型的bean

com.project.example.dao.VerverDao顶部添加@Repository,以解决此问题。

VerverDao

注意:根据您的包装结构,确保VerverDao在组件扫描路径中。