복붙노트

[SPRING] 내 맞춤 Wicket 모델 클래스에 Spring bean을 주입하려면 어떻게해야합니까?

SPRING

내 맞춤 Wicket 모델 클래스에 Spring bean을 주입하려면 어떻게해야합니까?

커스텀 Wicket 클래스에서, 다음과 달리, SpringBean annotation (wicket-spring 프로젝트의)에 정의 된대로 Spring에 의해 주입되어야하는 서비스 빈을 사용하고 있습니다.

public class ReportExportFileModel extends AbstractReadOnlyModel<File> {

    @SpringBean(name = "reportService")
    ReportService reportService;

    ReportDto reportDto;

    ReportExportFileModel(ReportDto reportDto) {
        this.reportDto = reportDto;
    }

    @Override
    public File getObject() {
        try {
            return reportService.generatePentahoReport(reportDto);
        } catch (ReportGenerationException e) {
           // ...
        }
    }
}

그러나 이것은 작동하지 않습니다. reportService.generatePentahoReport ()는 NullPointerException으로 실패합니다. 왜냐하면 어떤 이유로 Spring에 의해 bean이 삽입되지 않았기 때문입니다.

흥미롭게도, Wicket 페이지에서 익명의 내부 클래스와 동일한 모델 코드를 사용했는데 거기에는 아무런 문제가 없었습니다.

이 문제를 어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.개찰구 종속성 주입은 IComponentInstantiationListener를 구현하는 클래스에서 작동합니다. 이러한 응용 프로그램 수준 수신기는 Component가 인스턴스화 될 때마다 호출됩니다. 이것은 구성 요소의 종속성 주입에 사용되는 후크입니다.

    개찰구 종속성 주입은 IComponentInstantiationListener를 구현하는 클래스에서 작동합니다. 이러한 응용 프로그램 수준 수신기는 Component가 인스턴스화 될 때마다 호출됩니다. 이것은 구성 요소의 종속성 주입에 사용되는 후크입니다.

    모델 클래스에는 그와 같은 메커니즘이 없습니다. 모든 모델은 IModel을 직접 구현할 수 있으므로 Component와 달리 수신기를 호출 할 수있는 추상 기본 클래스가 없습니다.

    내 주입 모델 (Wicket 1.5)에 다음 기본 클래스를 사용합니다.

    public abstract class InjectedDetachableModel<T> extends LoadableDetachableModel<T> {
    
        public InjectedDetachableModel() {
            Injector.get().inject(this);
        }
    
        public InjectedDetachableModel(T a_entity) {
            super(a_entity);
            Injector.get().inject(this);
        }
    }
    

    편집하다: Wicket 1.5 이전 가이드에서 가져온 1.4와 1.5 사이의 관련 차이점 요약 :

    @Override
    protected void init()
    {
        // initialize Spring
        addComponentInstantiationListener(new SpringComponentInjector(this, applicationContext));
    }
    

    InjectorHolder.getInjector().inject(Object object)
    
    @Override
    protected void init()
    {
        // initialize Spring
        getComponentInstantiationListeners().add(new SpringComponentInjector(this, applicationContext))
    }
    

    Injector.get().inject(Object object)
    
  2. ==============================

    2.분명히 스프링 빈은 페이지보다 다른 클래스에 자동으로 주입되지 않습니다. 내 WebRequestCycle 클래스에서이 작업을 실행했습니다.

    분명히 스프링 빈은 페이지보다 다른 클래스에 자동으로 주입되지 않습니다. 내 WebRequestCycle 클래스에서이 작업을 실행했습니다.

    쉬운 해결책 중 하나는 InjectorHolder.getInjector (). inject (this)를 사용하여 수동으로 주입을 트리거하는 것입니다.

    이렇게 생성자를 작성하면 모델이 의도 한대로 작동합니다.

    ReportExportFileModel(ReportDto reportDto) {
        this.reportDto = reportDto;
        InjectorHolder.getInjector().inject(this);
    }
    

    편집 : 아, 바로 게시 한 후, 나는 무슨 일이 일어나고 있는지 더 정확한 설명과 함께 다른 질문을 찾았 :

  3. from https://stackoverflow.com/questions/8155359/how-can-i-get-a-spring-bean-injected-in-my-custom-wicket-model-class by cc-by-sa and MIT license