繁体   English   中英

Spring Boot在配置问题中定义bean

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM