4

我对 Tapestry 5 和 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...

无论如何,问题是:如何将实现相同接口的两个不同的 spring bean 注入 Tapestry 5 页面?

4

2 回答 2

2

我解决了这个问题。

首先我做了一个新的注释

public @interface Bean {
    String value();
}

并且我在有实现相同接口的多个 bean 之一的任何地方都使用它

@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 回答