1

Groovy を学習し、それを既存の Java jar と統合しようとしています。JavaコードはDIを利用していますが、グルーヴィーなスクリプトから動作させることができません。

Java アプリケーションには、Mybatis を使用したデータ アクセス レイヤーが含まれています。このレイヤーは、いくつかのインターフェイス (IUser など) とコントローラーなどで構成されます。

@Service
public class UserController implements IUser

コントローラーは Mybatis マッパー クラスを利用します。

すべては、Spring と default-autowire="byName"> を使用してまとめられます。

アノテーションを使用してコントローラー内のマッパーにアクセスするように設定されています。

Mybatis は Spring で構成され、マッパーをスキャンして注入します

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.directski.data.mapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>

したがって、Javaでアプリケーションを実行すると、すべてが正常に機能します。私が使用して呼び出したすべてのマッパーを含む

@Autowired
private UserMapper userMapper;

この jar を groovy スクリプトの一部として含めようとすると、いくつかの問題が発生し始めます。Springに同じapplicationContextファイルを使用しています

ApplicationContext ctx = new ClassPathXmlApplicationContext("controller-layer-applicationContext.xml");

スクリプトとして実行すると、ログからコンポーネントがスキャンされていることがわかります。私のコントローラーの一部には、呼び出される @PostConstruct メソッドが含まれており、データベース クエリが正常に実行されます。ただし、スクリプトからコントローラーを呼び出そうとすると、null ポインター エラーが発生します。

@Autowired を使用して groovy でコントローラーを作成しようとしましたが、注入されないようです。http://groovy.codehaus.org/Using+Spring+Factories+with+Groovyの例に従って factory.registerBeanDefinition() も実装し ましたが、これによりコントローラーが作成されるように見えますが、Mybatis マッパーは私のコントローラーが null を返す

コントローラーが Groovy から正しく自動配線されていることを確認するにはどうすればよいですか?

4

1 に答える 1

0

わかりました、それで私は何かが働いています。回答5から取得プロパティが注入されたBean定義をプログラムで作成する方法は?

public class AppContextExtendingBean implements ApplicationContextAware{


@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{

    AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();

    version1(beanFactory);

    }


    private void version1(AutowireCapableBeanFactory beanFactory){
    IUser userController= (UserController) beanFactory.createBean(UserController,AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
    beanFactory.initializeBean(userController, "user");

    User testuser = userController.getUser(3);


    }


}


ApplicationContext ctx = new ClassPathXmlApplicationContext("controller-layer-applicationContext.xml");

AppContextExtendingBean bean = new AppContextExtendingBean();

bean.setApplicationContext(ctx);
于 2013-07-11T15:19:12.820 に答える