2017-02-14 3 views
0

の適格なBeanはありません。私は上記の例外をスタックして、なぜそれが現れているかを控えめにしていません。私は春のブートを使用しており、注釈を通じてBeanを宣言しています。NoSuchBeanDefinitionException:タイプ

アプリケーションは、このクラスで実行されます。

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 


@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 

    return application.sources(Application.class); 
} 

public static void main(String[] args) throws Exception { 
    SpringApplication.run(Application.class, args); 

} 

私の問題Beanには、次のように宣言しています

@Service 
public class OrderSvc extends AbstractService implements DAOService { 

私は以下の豆に入れしよう:

@RestController 
public class OrderController { 

@Autowired 
CarSvc carSvc; 

@Autowired 
OrderSvc orderSvc; 

例外が表示されます:Could not autowire field: biz.Services.OrderSvc biz.controllers.rest.administrator.OrderController.orderSvc; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [biz.Services.OrderSvc] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

I持ってOrderSvcと同じパッケージに位置し、同じクラスを拡張しますが

@Service 
public class CarSvc extends AbstractService implements DAOService<Car> { 

あなたは、この例外が表示された理由を任意のアイデアを持っていますか、それインジェクションに問題がないされてもCarSvc豆?

+0

'OrderSvc'にジェネリックインターフェイス' DaoService 'を実装したときにタイプを宣言しませんでした。打ち間違え? –

+0

はい、それは私のせいですが、私の問題は解決しません。 –

+0

'OrderSvc'は' DAOService 'または' DAOService 'を実装していますか? –

答えて

1

ではなく実装よりもインタフェースを使用して、あなたの豆をautowireするようにしてくださいしかし、その前に、あなたのサービスに名前を付ける必要があります:

@Service("carSvc") 
public class CarSvc extends AbstractService implements DAOService<Car> {} 

@Service("orderSvc") 
public class OrderSvc extends AbstractService implements DAOService<Order> {} 

ここで何が起こっているということですSpringは、CarSvc、OrderSvcに基づいてサービスのプロキシを生成し、DAOServiceを実装しますが、CarSvc、OrderSvcは拡張しません。

//somthing like this 
class CarSvcProxy implement DAOService { 

    public Object getOrder(Long id) { 

     try { 

      // ... 

      txManager.commit(); 

     } catch (Exception ex) { 
      txManager.rollback(); 
     } 
    } 
} 

@RestController 
public class OrderController { 

    //So when you do this : 
    @Autowired 
    CarSvc carSvc; 

    //it's somehow like if you did : 
    CarSvc carSvc = new CarSvcProxy(); //carSvc != CarSvcProxy 

    //But this will work : 
    DAOService carSvc = new CarSvcProxy(); //because CarSvcProxy implement DAOService 

} 
0

私は例外につながるコードを発見しましたが、私は本当になぜundestandしないのですか。

@Transactional(readOnly = true) 
public Object getOrder(Long id) { 
    final Order order = getDAO().findOne(id); 
    OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class); 
    return orderDTO; 
} 

注釈@Transactional(readOnly = true)は、アプリケーションが問題なくexcecutedすることができ除外されたのであれば...あなたはどんなアイデアにNoSuchBeanDefinitionExceptionに、なぜこの注釈のリードを持っていますか?私のOrderSvc次のような方法があるで

@RestController 
public class OrderController { 

    @Autowired 
    @Qualifier("carSvc") 
    DAOService carSvc; 

    @Autowired 
    @Qualifier("orderSvc") 
    DAOService orderSvc; 

} 

編集:

2

春は、トランザクション動作を追加し、オブジェクトへの呼び出しをインターセプトすることができるように、@Transactionalを宣言するクラス用のプロキシを作成します。 Beanがインタフェースを拡張する場合、SpringはJDK Reflection APIを使用して動的プロキシを作成しますが、これはインタフェースでのみ行うことができます。プロキシは、同じインタフェースを実装する新しいオブジェクトです。したがって、ターゲットBeanは実装ではなくプロキシです。これが、非修飾Bean例外を取得した理由です。

CGLIBは、サブクラス化によってプロキシを作成できます。

したがって、動作させるには、Beanのタイプをインタフェースに変更するか、@EnableTransactionManagement(proxyTargetClass = true)を使用してcglibを設定する必要があります。

+0

を説明してくれてありがとうございます。 –

関連する問題