2010-12-01 19 views
2

AbstractControllerを拡張するすべてのコンクリートコントローラで異なるものとなるように設定されたportletBaseViewNameというプロパティを持つ次の抽象クラスがあります。注釈を介した注入とSpringのXMLファイルを介する注入継承に関する制限

public abstract class AbstractController { 

    private String portletBaseViewName; 

    protected String getPortletBaseViewName() { 
     return portletBaseViewName; 
    } 

    @Required 
    @Value("") 
    public void setPortletBaseViewName(String portletBaseViewName) { 
     this.portletBaseViewName = portletBaseViewName; 
    } 

} 

@Controller 
@RequestMapping("VIEW") 
public class ReservationOfBooksViewController extends AbstractController{} 

私はそうやって、それがXMLで注射を宣言することも可能である知っている:

<bean id="abstractController" class="es.alcampo.portalweb.portlets.common.controller.AbstractController" abstract="true"> 
    <property name="portletBaseViewName" value="" /> 
</bean> 

<bean id="reservationOfBooksViewController" class="es.example.portalweb.portlets.reservationofbooks.controller.ReservationOfBooksViewController" parent="abstractController"> 
    <property name="portletBaseViewName" value="reservationOfBooks" /> 
</bean> 

<bean id="myShopViewController" class="es.example.portalweb.portlets.reservationofbooks.controller.MyShopViewController" parent="abstractController"> 
    <property name="portletBaseViewName" value="myShop" /> 
</bean> 

は私が再定義する必要がありますか?:

@Controller 
@RequestMapping("VIEW") 
public class ReservationOfBooksViewController extends AbstractController{ 
    @Value("reservationOfBooks") 
    public void setPortletBaseViewName(String portletBaseViewName) { 
     super.setPortletBaseViewName(portletBaseViewName); 
    } 
} 

私は、以前のが好きではありません注釈を使って具体的なクラスに応じて1つの値などを注入する目的に到達する場合は、最もエレガントなオプションですか?

私は継承を知っていて、アノテーションが競合することがあります。

ありがとうございます。

答えて

1

実際に@Valueが必要ですか?

@Valueは、実行時にSpringによって評価されるいくつかの式が含まれている場合に便利です。そうしないと、明示的な初期化とそれを置き換える(およびsetterメソッドを維持することで、XML構成から、この値を上書きすることを可能にする)ことができます。前の回答に@axtavtで示さ

public abstract class AbstractController { 
    protected String portletBaseViewName = "";  

    public void setPortletBaseViewName(String portletBaseViewName) { 
     this.portletBaseViewName = portletBaseViewName; 
    } 
} 

@Controller 
@RequestMapping("VIEW") 
public class ReservationOfBooksViewController extends AbstractController{ 
    public ReservationOfBooksViewController() { 
     this.portletBaseViewName = "reservationOfBooks"; 
    } 
} 
+0

@Juan:別の '@ Value'が必要ない場合は、別のセッターは必要ありません。 – axtavt

+0

@元:なぜそれぞれの具体的なクラスに別のセッターが必要ですか? – axtavt

+0

urコードを編集してください。解決策としてマークします:) –

0

として、あなたはAbstractController内の任意の注釈を必要としません。さらに、XMLでabstractControllerを定義する必要はありません。場合は、あなたがそのサブクラスのすべてに共通のプロパティを設定したい、あなたは(任意のクラス名を指定せずに)抽象Beanにそれらを置くことができます。サブクラスで

<!-- define common properties in abstract bean--> 
<bean id="controllerTemplate" abstract="true" /> 



<bean id="reservationOfBooksViewController" class="es.example.portalweb.portlets.reservationofbooks.controller.ReservationOfBooksViewController" parent="controllerTemplate"> 
<property name="portletBaseViewName" value="reservationOfBooks" /> 

、@value注釈が必要とされず、 'getPortletBaseViewName()'メソッドを使用してビュー名を取得できます。

関連する問題