Java @Autowired没有将我的服务注入我的托管bean中
我正在尝试执行以下测试:Java @Autowired没有将我的服务注入我的托管bean中,java,spring,hibernate,Java,Spring,Hibernate,我正在尝试执行以下测试: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = DBDataManipulatorServiceTestContext.class, loader = SpringApplicationContextLoader.class) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DBDataManipulatorServiceTestContext.class, loader =
SpringApplicationContextLoader.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class UserInterfaceBeanTest {
@Autowired
private DBDataManipulatorService dbDataManipulatorService;
.....
@Test
public void testGetDistinctWorkPackageId() {
WorkPackage workPackage1 = new WorkPackage();
workPackage1.setWorkPackageId("TEST1");
workPackage1.setWorkPackageName("WP_1");
WorkPackage workPackage2 = new WorkPackage();
workPackage2.setWorkPackageId("TEST2");
workPackage2.setWorkPackageName("WP_2");
WorkPackage workPackage3 = new WorkPackage();
workPackage3.setWorkPackageId("TEST3");
workPackage3.setWorkPackageName("WP_3");
WorkPackage workPackage4 = new WorkPackage();
workPackage4.setWorkPackageId("TEST4");
workPackage4.setWorkPackageName("WP_4");
Aircraft aircraft1 = new Aircraft();
aircraft1.setAircraftId(50001);
aircraft1.setModel("100");
Aircraft aircraft2 = new Aircraft();
aircraft2.setAircraftId(50002);
aircraft2.setModel("100");
aircraft1.addOrUpdateWorkPackageToAircraft(workPackage1);
aircraft1.addOrUpdateWorkPackageToAircraft(workPackage3);
aircraft2.addOrUpdateWorkPackageToAircraft(workPackage2);
aircraft2.addOrUpdateWorkPackageToAircraft(workPackage3);
Map<Integer, Aircraft> aircraftsMap = new HashMap<Integer, Aircraft>();
aircraftsMap.put(50001, aircraft1);
aircraftsMap.put(50002, aircraft2);
UserInterfaceBean userInterfaceBean = new UserInterfaceBean();
userInterfaceBean.setModel("100");
aircraftsMap = dbDataManipulatorService.saveToDataBase(aircraftsMap);
List<String> workPackgesIds = userInterfaceBean.getDistinctWorkPackageId();
assertTrue(workPackgesIds.contains("TEST1"));
assertTrue(workPackgesIds.contains("TEST2"));
assertTrue(workPackgesIds.contains("TEST3"));
assertTrue(!workPackgesIds.contains("TEST4"));
}
谁能告诉我哪里出了问题?以及如何解决这个问题
编辑
以下是我的DbDataManipulator服务示例:
@Service
@Transactional
public class DBDataManipulatorServiceImpl implements DBDataManipulatorService {
.....
}
这是它的界面:
public interface DBDataManipulatorService {
public AircraftRepository getAircraftRepository();
public Aircraft getAircraftById(String id);
public Map<Integer, Aircraft> saveToDataBase(Map<Integer, Aircraft> aircrafts);
public MyJob findJobByJobId(String jobId);
public WorkPackage findWorkPackageByAircraftIdAndWorkPackageId
(int aircraftId, String workPackageId);
public Aircraft findAircraftByaircraftId(int aircraftId);
public List<Aircraft> findAllAircrafts();
public List<String> findAllAvailableAircraftsModels();
public List<Aircraft> findAllAircraftsByModel(String model);
public List<WorkPackage> getWorkPackagesByAircraftModel(String model);
公共接口DBDataManipulator服务{
公共航空器存储库getAircraftRepository();
公共飞机getAircraftById(字符串id);
公共地图保存数据库(飞机地图);
公共MyJob findJobByJobId(字符串jobId);
公共工作包FindWorkPackageByAircrafter ID和WorkPackageID
(int aircraftId,字符串工作包ID);
公共飞机findAircraftByaircraftId(国际飞机ID);
公共列表FindArcrafts();
公共列表FindAvailableAircrafts模型();
公共列表findAllAircraftsByModel(字符串模型);
公共列表getWorkPackagesByAircraftModel(字符串模型);
}默认情况下,
@Autowired
注释意味着必须找到bean,否则您将得到一个bean not found异常
有几件事可能导致这种情况:
- 单元测试是通过
实例化的,而不是作为springbean进行扫描,在这种情况下,new DBDataManipulatorServiceContext()
被忽略@Autowired
- 有一些XML配置覆盖了annotations配置,因此bean首先是在启用autowiring的情况下创建的,然后被XML中定义的bean丢弃,没有为缺少的属性提供参数
@ComponentScan
,但您没有输入要扫描的包的名称。默认行为是从您放置了@ComponentScan
的包中进行扫描,基本上就是您的dbdatamanufactorservicecontext
config类的包。我猜这不是您的dbdatamanufactorservice
所在的位置,如果是的话,请为您的@ComponentScan
指定一个包名。谢谢您的努力,但是,您没有告诉我如何解决我的问题:您的dbdatamanufactorservice
bean的配置在哪里。您的配置不正确。请检查更新的编辑。DBDataManipulatorServiceTestContext中有什么?我猜您复制了DBDataManipulatorServiceContext类的内容。是吗?是的,是的。我需要更改什么吗?请注意我的代码。我已经使用:lef.setPackagesToScan(“com”)指定了要在DbDataManufactorServiceContext中扫描的包,而DbDataManufactorService位于com.services中这将不起作用,该扫描是针对JPA实体类的,而不是针对SpringBeans的,您必须按我指定的方式添加@ComponentScan。我可能还遗漏了一件事-看起来您需要在DBDataManipulator Service Context上添加@Configuration
,您也可以尝试添加它吗。如果这不起作用,请在github项目中共享一小部分工作测试,这可能会更容易。
public interface DBDataManipulatorService {
public AircraftRepository getAircraftRepository();
public Aircraft getAircraftById(String id);
public Map<Integer, Aircraft> saveToDataBase(Map<Integer, Aircraft> aircrafts);
public MyJob findJobByJobId(String jobId);
public WorkPackage findWorkPackageByAircraftIdAndWorkPackageId
(int aircraftId, String workPackageId);
public Aircraft findAircraftByaircraftId(int aircraftId);
public List<Aircraft> findAllAircrafts();
public List<String> findAllAvailableAircraftsModels();
public List<Aircraft> findAllAircraftsByModel(String model);
public List<WorkPackage> getWorkPackagesByAircraftModel(String model);