使用Spring

时间:2017-09-07 05:46:38

标签: java spring spring-restcontroller

我试图从我的控制器类调用实现方法。我在@Component中注释了接口,并在我的控制器中自动连接了这个接口。但是,它给我带来了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类

@Component
public class DpDAO  {

public String createPurchase(String partyId, String dealId) {
    // Able to get logs here
    return null;
}

}

我们不能注释接口吗?任何想法将不胜感激。

2 个答案:

答案 0 :(得分:1)

我怀疑问题是void readInv(ArrayBag &ArrayBag1, ArrayBag &ArrayBag2) { //ArrayBag1 and ArrayBag2 are objects of class ArrayBag std::string inVal; //value to hold each line in file std::ifstream readFile; readFile.open("setInventory.txt"); //"setInventory.txt" is the txt file being read from. if (readFile.is_open()) { std::cout << "File is being read." << std::endl; while(!readFile.eof()) { getline(readFile, inVal); for(int i = 0; i < inVal.size(); i++) { std::cout << inVal[i] << std::endl; ArrayBag1.add(inVal[i] - '0'); //ArrayBag1.add() is the public member function used to add the //passing value to the private member array. } } } } 是一个接口,而PurchaseService是一个类。也就是说,你有一个后者的实例,但不是前者的实例。

如果那是真的,那么Spring找不到要注入的bean。因此,您需要一些方法来创建要注入的DpDAO实例。

您可以创建一个实例:

PurchaseService

或者您在其中一个初始化类上有工厂方法。类似的东西:

@Component
class PurchaseServiceImpl implements PurchaseService
{
     // Fill in
}

答案 1 :(得分:0)

您的界面是一个规范。虽然您使用@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;