2017-01-11 2 views
0

Я пытаюсь повторно связать поле @Autowired после сериализации сеанса с Redis с использованием Spring Session и Aspectj.org.springframework.beans.factory.wiring.BeanWiringInfo.BeanWiringInfo инициализируется нулевым именем

Это фасоль:

@UIScope() 
@SpringComponent(value = AboutView.VIEW_NAME) 
@SpringView(name = AboutView.VIEW_NAME)  
// 
@Configurable(autowire = Autowire.BY_NAME, value = AboutView.VIEW_NAME, dependencyCheck = false, preConstruction = true) 
public class AboutView extends AbstractView { 

    public static final String VIEW_NAME = "butterfly-effect-frontend-system:about"; 

    private Table tableFrontEndInformation; 

    private GridLayout backendLayout; 

    private GridLayout frontendLayout; 

    @Autowired 
    private transient DiscoveryClient discoveryClient; 

Этот компонент использует @Configurable и имя определения фасоли (значение). К сожалению, аспект заключается в создании BeanWiringInfo с нулевым именем bean, что приведет к возникновению ошибки, поскольку имя требуется.

@Configurable(autowire = Autowire.BY_NAME, value = AboutView.VIEW_NAME, dependencyCheck = false, preConstruction = true) 

ошибка происходит из-за следующего конструктора, который вызывается AnnotationBeanWiringInfoResolver

/** 
    * Create a new BeanWiringInfo that points to the given bean name. 
    * @param beanName the name of the bean definition to take the property values from 
    * @param isDefaultBeanName whether the given bean name is a suggested 
    * default bean name, not necessarily matching an actual bean definition 
    * @throws IllegalArgumentException if the supplied beanName is {@code null}, 
    * is empty, or consists wholly of whitespace 
    */ 
    public BeanWiringInfo(String beanName, boolean isDefaultBeanName) { 
     Assert.hasText(beanName, "'beanName' must not be empty"); 
     this.beanName = beanName; 
     this.isDefaultBeanName = isDefaultBeanName; 
    } 

AnnotationBeanWiringInfoResolver инстанцирует BeanWiringInfo из этого кода:

protected BeanWiringInfo buildWiringInfo(Object beanInstance, Configurable annotation) { 
     if (!Autowire.NO.equals(annotation.autowire())) { 
      return new BeanWiringInfo(annotation.autowire().value(), annotation.dependencyCheck()); 
     } 
     else { 
      if (!"".equals(annotation.value())) { 
       // explicitly specified bean name 
       return new BeanWiringInfo(annotation.value(), false); 
      } 
      else { 
       // default bean name 
       return new BeanWiringInfo(getDefaultBeanName(beanInstance), true); 
      } 
     } 
    } 

Это ошибка:

Caused by: java.lang.IllegalArgumentException: 'name' must not be null 
    at org.springframework.util.Assert.notNull(Assert.java:115) ~[spring-core-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.BeanFactoryUtils.transformedBeanName(BeanFactoryUtils.java:72) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.transformedBeanName(AbstractBeanFactory.java:1109) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:970) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at com.vaadin.spring.internal.SpringViewDisplayPostProcessor.postProcessAfterInitialization(SpringViewDisplayPostProcessor.java:66) ~[classes/:na] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:423) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1594) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:400) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.wiring.BeanConfigurerSupport.configureBean(BeanConfigurerSupport.java:142) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect.configureBean(AnnotationBeanConfigurerAspect.aj:63) ~[spring-aspects-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at org.springframework.beans.factory.aspectj.AbstractDependencyInjectionAspect.ajc$before$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$1$e854fa65(AbstractDependencyInjectionAspect.aj:79) ~[spring-aspects-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    at com.scipionyx.butterflyeffect.frontend.configuration.ui.view.AboutView.<init>(AboutView.java:72) ~[classes/:na] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_45] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_45] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_45] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422) ~[na:1.8.0_45] 
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
    ... 107 common frames omitted 

Кто-нибудь знает, что может быть неправильным в этой конфигурации?

Ваша помощь нам очень ценится.

ответ

0

Я все еще пытаюсь понять, почему, но кажется, что удаление autowire = Autowire.BY_NAME из @Configuration, похоже, решает проблему.

Теперь класс выглядит следующим образом:

@UIScope() 
@SpringComponent(value = AboutView.VIEW_NAME) 
@SpringView(name = AboutView.VIEW_NAME) 

// 
@Configurable(value = AboutView.VIEW_NAME) 
public class AboutView extends AbstractView { 
Смежные вопросы