0

(コントローラー - サービス - dao - エンティティ レイヤー) を使用する春の休止状態の Java プロジェクトでは、抽象ファクトリ パターンがあります (抽象クラスには 2 つの抽象メソッドがあります)。実装された抽象ファクトリ パターンのクラスでは、dao メソッドを使用しています (名前付きクエリを実行するため)。リクエストが別の Service クラスからのサービス impl に到達すると、null ポインタの例外が発生します。サービス impl で dao クラスを自動配線しました `

AbstractFruitService - [addToBasket() and removeFromBasket()] 
|
|- SeasonalFruitsServicsImpl - SeasonalFruitsDAO
| 
|- BerryFruitsServiceImpl - BerryFruitsDAO

@Service("abstractFruitService") を SeasonalFruitsServicsImpl と BerryFruitsServiceImpl の両方に追加できません。エラーが発生します - 同じ名前とクラスの互換性のない既存の Bean 定義と競合します

この場合、Spring static/instance factory メソッドが役立つかどうかわからないので、これも試してみましたが、うまくいきませんでした

何かアプローチはありますか

4

2 に答える 2

2

あなたがやっていることはむしろService Locatorパターンのように見えます.Service Locatorは依存性注入の代替です. したがって、すでに IoC Spring Container を使用している場合は、実装する理由はありません。

SeasonalFruitsServiceImplとを個別の Bean として宣言BerryFruitsServiceImplし、それぞれのインターフェース SeasonalFruitsDAOとを使用するかBerryFruitsDAO、個別の名前を提供することで、コンテナーからインスタンスを要求できます (実装を置き換える必要がある場合は、コンテナーに別の実装を登録するだけです)。

Martin J. Fowler の記事を参照

サービス ロケータがサード パーティによって提供された場合は、サービス ロケータのインスタンスを作成する必要があります。

<bean id="someServiceLocator" class="com.some3rdparty.ServiceLocator"/>
<bean id="seasonalFruitsDao" factory-bean="someServiceLocator" factory-method="createSeasonalFruitDao"/>
<bean id="berryFruitsDao" factory-bean="someServiceLocator" factory-method="createBerryFruitsDao"/>

またはJavaコード構成を使用

@Configuration
public class someServiceLocatorConfiguration{
  @Bean
  public ServiceLocator locator(){
    return new com.some3rdparty.ServiceLocator();
  }
  @Bean()
  public SeasonalFruitsDao  seasonalFruitsDao(){
    return locator().createSeasonalFruitDao();
  }
  @Bean()
  public SeasonalFruitsDao  seasonalFruitsDao(){
    return locator().createSeasonalFruitDao();
  }
}

しかしもちろん、自分で開発したオブジェクトをインスタンス化するためにそれを行うべきではありません。

于 2012-12-22T13:59:29.070 に答える
0

注釈を使用する@Transactional(propagation = Propagation.REQUIRES_NEW)と、コードに最適に機能します。サービスメソッドでこの機能を追加すると、正常に機能しました

于 2012-12-25T13:42:28.730 に答える