未使用 Spring 从 Rest Controller 调用实现方法
Implementation method not being called from Rest Controller using Spring
我正在尝试从我的控制器中调用实现方法 class。我已经在我的控制器中使用 @Component 和 Autowired 注释了这个接口。但是,它向我抛出 404 异常。
在另一种方式中,我创建了一个简单的 DAO 并使用 @Component 注释,这是在我的控制器上工作的。
我的问题是我想接着调用一个接口方法,该方法将调用 DAO。
这是我的流程。
@RestController
public class PurchaseController {
/*@Autowired
private DpDAO dpDAO;*/ ----> This is working
@Autowired
private PurchaseService purchaseService; --> This is not working
@GetMapping("/purchase/{partyId}/{dealId}")
public String createPurchase(@PathVariable("partyId") String partyId, @PathVariable("transactionId") String transactionId) {
return purchaseService.createPurchase(partyId, transactionId); --> This is not working
//return dpDAO.createPurchase(partyId, transactionId); --> This is working
}
}
我的界面
@Component
public interface PurchaseService {
public String createPurchase(String partyId, String transactionId);
}
DpDAO class
@Component
public class DpDAO {
public String createPurchase(String partyId, String dealId) {
// Able to get logs here
return null;
}
}
我们不能注释接口吗?任何想法将不胜感激。
我怀疑问题是 PurchaseService
是一个接口,而 DpDAO
是一个 class。也就是说,您有后者的实例,但没有前者的实例。
如果这是真的,那么 Spring 找不到要注入的 bean。所以你需要一些方法来创建要注入的 PurchaseService
的实例。
您可以这样创建实例:
@Component
class PurchaseServiceImpl implements PurchaseService
{
// Fill in
}
或者您的其中一个初始化程序 class 有一个工厂方法。类似于:
@Bean
public PurchaseService createService()
{
return new PurchaseServiceImpl();
}
你的接口是一个规范。尽管您使用 @Autowired 注释您的接口,但 spring 真正做的是注入您指定的实现。
因此
要么你提供一个接口实现作为组件
@Service
public class PurchaseServiceImpl implements PurchaseService {
}
或者您创建一个返回您选择的实现的 bean
@Configuration
public class MyConfig {
@Bean
public PurchaseService purchaseService() {
//TODO
}
}
存在多个接口实现的情况。在那些情况下,您使用限定符。例如
@Service("one")
public class PurchaseServiceIOne implements PurchaseService {
}
@Service("two")
public class PurchaseServiceTwo implements PurchaseService {
}
您使用限定符注入服务
@Autowired
@Qualifier("one")
private PurchaseService purchaseService;
我正在尝试从我的控制器中调用实现方法 class。我已经在我的控制器中使用 @Component 和 Autowired 注释了这个接口。但是,它向我抛出 404 异常。
在另一种方式中,我创建了一个简单的 DAO 并使用 @Component 注释,这是在我的控制器上工作的。
我的问题是我想接着调用一个接口方法,该方法将调用 DAO。
这是我的流程。
@RestController
public class PurchaseController {
/*@Autowired
private DpDAO dpDAO;*/ ----> This is working
@Autowired
private PurchaseService purchaseService; --> This is not working
@GetMapping("/purchase/{partyId}/{dealId}")
public String createPurchase(@PathVariable("partyId") String partyId, @PathVariable("transactionId") String transactionId) {
return purchaseService.createPurchase(partyId, transactionId); --> This is not working
//return dpDAO.createPurchase(partyId, transactionId); --> This is working
}
}
我的界面
@Component
public interface PurchaseService {
public String createPurchase(String partyId, String transactionId);
}
DpDAO class
@Component
public class DpDAO {
public String createPurchase(String partyId, String dealId) {
// Able to get logs here
return null;
}
}
我们不能注释接口吗?任何想法将不胜感激。
我怀疑问题是 PurchaseService
是一个接口,而 DpDAO
是一个 class。也就是说,您有后者的实例,但没有前者的实例。
如果这是真的,那么 Spring 找不到要注入的 bean。所以你需要一些方法来创建要注入的 PurchaseService
的实例。
您可以这样创建实例:
@Component
class PurchaseServiceImpl implements PurchaseService
{
// Fill in
}
或者您的其中一个初始化程序 class 有一个工厂方法。类似于:
@Bean
public PurchaseService createService()
{
return new PurchaseServiceImpl();
}
你的接口是一个规范。尽管您使用 @Autowired 注释您的接口,但 spring 真正做的是注入您指定的实现。
因此 要么你提供一个接口实现作为组件
@Service
public class PurchaseServiceImpl implements PurchaseService {
}
或者您创建一个返回您选择的实现的 bean
@Configuration
public class MyConfig {
@Bean
public PurchaseService purchaseService() {
//TODO
}
}
存在多个接口实现的情况。在那些情况下,您使用限定符。例如
@Service("one")
public class PurchaseServiceIOne implements PurchaseService {
}
@Service("two")
public class PurchaseServiceTwo implements PurchaseService {
}
您使用限定符注入服务
@Autowired
@Qualifier("one")
private PurchaseService purchaseService;