我有一个spring boot应用程序,我试图注入一个存储库。每次我尝试使用存储库时为null。这是一段代码:
我的主要申请
package com.cisco.ido.no2.deployment;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableAutoConfiguration
@SpringBootApplication
public class No2AlDeviceDeploymentIdApplication {
public static void main(String[] args) {
SpringApplication.run(No2AlDeviceDeploymentIdApplication.class, args);
}
}
我的组件
@Component
@PostBack(route = "no2.deployment", dataClass = String.class, queue = "no2-deployment")
public class DevicePostbackRunnable extends PostBackRunnable<String> {
@Autowired
private DeviceTypeRepository deviceTypeRepository;
public DevicePostbackRunnable() {}
public DevicePostbackRunnable(Class<String> dataClass) {
super(dataClass);
}
@Override
public void processTaskResult(String result, RunningTask runningTask) {
DeviceType dt = deviceTypeRepository.findOne((long)12); // <-----here
int yy = 90;
}
}
这是我的存储库代码:
package com.cisco.ido.no2.deployment.repositories;
import com.cisco.ido.no2.deployment.entities.DeviceType;
import org.springframework.data.repository.CrudRepository;
public interface DeviceTypeRepository extends CrudRepository<DeviceType, Long> {
}
我的DevicePostBackRunnable包名是com.cisco.ido.no2.deployment
。当我呼叫DeviceType dt = deviceTypeRepository.findOne
时,它始终为空。有没有办法让这项工作?此外,当我在Rest Controller中注入此存储库时,它可以正常工作。
答案 0 :(得分:1)
您的界面应具有以下注释之一,以便在春季注射:
@Component
@Service
@Repository
@Controller
答案 1 :(得分:1)
您应该将@Repository放在界面 DeviceTypeRepository 中。以便 当您使用@Autowired时,Spring容器会自动检测该类,作为容器组件扫描过程的一部分。
@Repository注释是任何满足该类的类的标记 存储库的角色或构造型(也称为数据访问对象) 或DAO)。这个标记的用途之一是自动翻译 第20.2.2节“异常翻译”中描述的例外情况。
Spring提供了进一步的构造型注释:@Component,@ Service, 和@Controller。 @Component是任何的通用构造型 Spring管理的组件。 @ Repository,@ Service和@Controller都是 对于更具体的用例,@ Component的特化 例如,在持久性,服务和表示层中, 分别。因此,您可以使用注释组件类 @Component,但是用@ Repository,@ Service或者注释它们 相反,@ Controller更适合你的类 通过工具处理或与方面相关联。例如,这些 构造型注释成为切入点的理想目标。也是 @Repository,@ Service和@Controller可能会携带 Spring框架的未来版本中的其他语义。从而, 如果您选择使用@Component或@Service作为您的 服务层,@ Service显然是更好的选择。同样,如 如上所述,已经支持@Repository作为标记 持久层中的自动异常转换。