2016-09-16 3 views
0

オートワイヤードサービスを自己インスタンス化ビューに渡す一般的な方法はありますか?私たちがSpring(@Autowired works)によって管理されるVerticalLayoutと内部にButton(Button)を持つHorizo​​ntalLayoutを持っているとしましょう。 Horizo​​ntalLayoutの複数のインスタンスを作成する必要があり、ボタンがサービスの何らかのアクションを実行します(@Autowiredは機能しません、Serviceはnullです)。この問題を解決するベストプラクティスは何ですか? Horizo​​ntalLayoutのコンストラクタへのパラメータとしてサービスを渡すだけですが、おそらくもっと良い方法があります。自己インスタンス化されたHorizo​​ntalLayoutでのオートワイヤリングサービス

@Service 
public class SomeService { 
    public void someMethod(){ 
    // do something 
    } 
} 

@SpringView(name = "SomeView") 
@ViewScope 
public class SomeView extends VerticalLayout { 

    @Autowired 
    private SomeService service; 

    public SomeView(){ 
     addComponent(new Subview()); 
     addComponent(new Subview()); 
    } 
} 

public class SubView extends HorizontalLayout { 

    @Autowired 
    private SomeService service; 

    public SubView(){ 
     Button btn = new Button("Test"); 
     btn.addClickListener(e->service.someMethod()); 
     addComponent(btn); 
    } 
} 

EDIT:コード例を追加しました。 SubViewのオブジェクトはサービスのためにnullを取得します。解決策は、サービスをコンストラクタに渡すことです。しかし、もっと良い解決策があるかどうかを知りたかったのです。

+0

なぜ*それがnullであるか、またはコンストラクタ経由で参照を渡さずにそれを行う方法を尋ねていますか?後者の場合は、コードの簡略化されたバージョンを含めることができます。 – kryger

+0

コードサンプルを追加しました。可能であれば、参照を渡さずにサービスにアクセスする方法を知りたかったのです。 – seniorbenelli

答えて

0

Vaadin Viewまたは通常のコンポーネントを意味しますか?ビューは、ビュー・インターフェース(com.vaadin.navigator.View)を実装する必要がありますので、あなたはサービスとあなたのUIを作成するために入力します()メソッドAutowireするコンストラクタを使用することができます。

@SpringView(name = "SomeView") 
@ViewScope 
public class SomeView extends VerticalLayout implements View { 

    private SomeService service; 

    @Autowired 
    public SomeView(SomeService service){ 
     this.service = service; 
    } 

    @Override 
    public void enter(ViewChangeListener.ViewChangeEvent event) { 
     //service is available here 
     removeAllComponents(); 
     addComponent(new Subview()); 
     addComponent(new Subview()); 
    } 
} 

方法、それをSpringはSomeViewをインスタンス化し、そのプロセスでコンストラクタを介してサービスを自動生成します。次に、Viewが呼び出されるたびにのenter()メソッドを使用してコンポーネントを描画します。その後、

それだけで通常のコンポーネント(私はそれがあなたのケースだと思う)だ場合は、代わりのは、(入力)方法で@PostConstructアノテーションを使用します。たとえば:

@Autowired 
public SomeView(SomeService service){ 
    this.service = service; 
} 

@PostConstruct 
public void init() { 
    //service is available here 
    addComponent(...); 
} 

私はこの注釈をテストしていませんが、それは広くdocumented in Vaadinです。それがあなたのために働くかどうか私に教えてください。

関連する問題