简体   繁体   English

Tapestry 5和具有相同接口的Spring bean

[英]Tapestry 5 and Spring beans with same interface

I have a problem with Tapestry 5 and Spring integration. 我对Tapestry 5和Spring集成有问题。 Problem occurs if I have a multiple beans that implement the same interface and I try to inject them with @Inject annotation. 如果我有多个实现相同接口的bean,并且尝试使用@Inject注释注入它们,则会出现问题。 Of course I got an exception. 我当然有例外。

I found a tutorial that says that in that case I have to use @Service annotation too but now I'm getting 我发现一个教程说,在这种情况下,我也必须使用@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...

Anyway, question is: How can I inject two different spring beans, that implement a same interface, into Tapestry 5 page? 无论如何,问题是:如何将两个实现相同接口的不同的spring bean注入Tapestry 5页面?

I solved this problem. 我解决了这个问题。

First I made a new annotation 首先,我做了一个新的注释

public @interface Bean {
    String value();
}

and I use this wherever I have this one of multiple beans implementing same interface 每当我有多个实现相同接口的bean中的一个时就使用它

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

Then I changed org.apache.tapestry5.internal.spring.SpringModuleDef 然后我更改了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);
             }
           }
         }
       };

It sounds like you either have a typo in the name give to the @Service annotation, or you have not actually defined the bean with the name that you are expecting. 听起来您要么在@Service批注的名称中输入了错字,要么实际上并没有使用期望的名称定义bean。 Without more information, it is hard to tell for sure, as there are also some other possibilities. 没有更多信息,很难确定,因为还有其他可能性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM