未使用 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;