代码之家  ›  专栏  ›  技术社区  ›  Aliy

未使用Spring从Rest控制器调用的实现方法

  •  0
  • Aliy  · 技术社区  · 8 年前

    我试图从我的控制器类调用一个实现方法。我已经用@Component注释了接口,并在我的控制器中自动连接了这个接口。但是,这给我带来了404异常。

    这是我的流程。

    @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 回复  |  直到 8 年前
        1
  •  1
  •   dave    8 年前

    我怀疑问题在于 PurchaseService 是一个接口,而 DpDAO 是一个班级。也就是说,你有后者的例子,但没有前者的例子。

    如果这是真的,那么Spring就无法找到要注入的bean。因此,您需要某种方法来创建 采购服务

    您可以这样创建一个实例:

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

    或者在一个初始化器类上有一个工厂方法。类似于:

    @Bean
    public PurchaseService createService()
    {
         return new PurchaseServiceImpl();
    }
    
        2
  •  0
  •   gkatzioura    8 年前

    您的接口是一个规范。尽管您用@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;