4

Tapestry5とSpringの統合に問題があります。同じインターフェースを実装する複数のBeanがあり、それらに@Injectアノテーションを挿入しようとすると、問題が発生します。もちろん例外があります。

その場合は注釈も使用する必要があるというチュートリアルを見つけました@Serviceが、今は

org.apache.tapestry5.internal.services.TransformationException
Error obtaining injected value for field 
com.foo.pages.Foo.testService: Service 
id 'someServiceIDeclaredInSpringContextFile' is not defined by any module...

とにかく、質問は次のとおりです。同じインターフェイスを実装する2つの異なるSpringBeanをTapestry5ページに注入するにはどうすればよいですか。

4

2 に答える 2

2

私はこの問題を解決しました。

まず、新しい注釈を作成しました

public @interface Bean {
    String value();
}

同じインターフェースを実装している複数のBeanの1つがある場合は常にこれを使用します

@Inject
@Bean("springBeanName")
Service foo;

それから私は変わりましたorg.apache.tapestry5.internal.spring.SpringModuleDef

private ContributionDef createContributionToMasterObjectProvider() {
  ....
  public void contribute(ModuleBuilderSource moduleSource, 
                ServiceResources resources,
                OrderedConfiguration configuration) {
    ....
    switch (beanMap.size()) {
           case 0:
             return null;
           case 1:
             Object bean = beanMap.values().iterator().next();
             return objectType.cast(bean);
           default:
             Bean annotation = annotationProvider.getAnnotation(Bean.class);
             Object springBean = null;
             String beanName = null;

             if (annotation != null) {
               beanName = annotation.value();
               springBean = beanMap.get(beanName);
             } else {
               String message = String.format(
                 "Spring context contains %d beans assignable to type %s: %s.",
                 beanMap.size(),
                 ClassFabUtils.toJavaClassName(objectType),
                 InternalUtils.joinSorted(beanMap.keySet()));
               throw new IllegalArgumentException(message);
             }
             if (springBean != null) {
               return objectType.cast(springBean);
             } else {
               String message = String.format(
                 "Bean [%s] of type %s doesn't exists. Available beans: %s",
                 beanName, ClassFabUtils.toJavaClassName(objectType),
                 InternalUtils.joinSorted(beanMap.keySet()));
               throw new IllegalArgumentException(message);
             }
           }
         }
       };
于 2010-04-22T08:43:30.167 に答える
0

@Serviceアノテーションに付けられた名前にタイプミスがあるか、期待している名前でBeanを実際に定義していないようです。他にもいくつかの可能性があるため、これ以上の情報がなければ、確実に判断するのは困難です。

于 2010-04-21T15:19:04.373 に答える