2009-07-24 62 views
4

我有一個JSF驗證器,用於檢查容器編號字符串是否符合ISO-6346規範。JSF:通過字段從驗證器訪問Bean

它工作正常,但是我需要添加一些條件處理基於容器號來自的Bean中的其他值。這個Bean可以有幾種不同的類型。

有什麼方法可以在驗證器中訪問Bean並對其執行操作?理想情況下,我很樂意保持它作爲驗證器,但是如果沒有解決方案,我必須在堅持之前在Bean中實現邏輯。

我想沿着線的東西:

public class ContainerNumberValidator implements javax.faces.validator.Validator { 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 

     Object bean = UIComponent.getMyBeanSomehowThroughAMagicMethod(); 
     if(bean instanceof BeanA) { 
     //do this 
     } else if(bean instanceof BeanB) { 
     //do that 
     } 
} 

UPDATE:在許多方面,這是一個類似的問題到多個領域同時進行驗證。由BalusC提供的This code是有幫助的。

非常感謝。

D.

回答

5

使用< f:attribute>你可以傳遞一個Bean來驗證和組件作爲值表達式檢索。

所以我的輸入是這樣的(必須使用<f:validator>並沒有對<h:inputText>驗證屬性):

<h:inputText id="containerNum" size="20" maxlength="20" value="#{containerStockAction.containerStock.containerNumber}"> 
    <f:validator validatorId="containerNumberValidator" /> 
    <f:attribute name="containerBean" value="#{containerStockAction.containerStock}"/> 
</h:inputText> 

而我的驗證器類:

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    String containerNumber = (String)value; 
    Object containerBean = component.getValueExpression("containerBean").getValue(context.getELContext()); 

    if(containerBean instanceof BeanA) { 
    //do this 
    } 
+0

另一種方法是直接從組件獲取屬性映射。結合它與你的東西的接口,它可以這樣簡單... ISOBean bean =(ISOBean)component.getAttribute(「containerBean」); bean.doStuff(); – Drew 2009-07-29 13:15:10

2

您可以使用下面的方法使用FacesContext獲得任何你喜歡的舊bean。與您找到的解決方案非常相似。

public void validate(FacesContext context, UIComponent component, Object value) 
{ 
    Application app = context.getApplication(); 

    ValueExpression expression = app.getExpressionFactory().createValueExpression(context.getELContext(), 
      "#{thingoBean}", Object.class); 

    ThingoBean thingoBean = (ThingoBean) expression.getValue(context.getELContext()); 
} 
+0

謝謝。如果你正在使用Seam,你可以用 做同樣的事情ThingoBean thingoBean =(ThingoBean)Component.getInstance(「thingoBean」); 但是使用這種方法我不能重用不同Beans的驗證器。 – Damo 2009-07-26 19:11:53