2010-03-30 3 views
1

나는 누구의 코드를 다음과 같이이다 열거이 -JSF '검증 오류 : 값이 유효하지 않습니다'

public enum COSOptionType { 

    NOTAPPLICABLE, 
    OPTIONAL, 
    MANDATORY; 

    private String[] label = { "Not Applicable", "Optional", "Mandatory"}; 

    @Override 
    public String toString() { 

     return label[this.ordinal()]; 
    } 

    public static COSOptionType getCOSOption(String value) { 
     int ivalue = Integer.parseInt(value); 
     switch(ivalue) { 
     case 0: 
      return NOTAPPLICABLE; 
     case 1: 
      return OPTIONAL; 
     case 2: 
      return MANDATORY; 
     default: 
       throw new RuntimeException("Should not get this far ever!"); 
     } 
    } 

} 

나는 열거 형에게

public class COSEnumConverter implements Converter { 

    public Object getAsObject(FacesContext context, UIComponent comp, String value) { 

     return COSOptionType.getCOSOption(value); 
    } 

    public String getAsString(FacesContext context, UIComponent comp, Object obj) { 
     if (obj instanceof String) { 
      return (String) obj; 
     } 
     COSOptionType type = (COSOptionType) obj; 
     int index = type.ordinal(); 
     return ""+index; 
    } 

} 

뷰를 변환하는 컨버터를 다음은이

<h:selectOneMenu value="#{controller.type}" id="smoking">           
    <f:selectItems value="#{jnyController.choices}" /> 
</h:selectOneMenu> 

처럼 보이는 것은 선택을 만들 코드입니다

private List<SelectItem> createChoicies() { 
    List<SelectItem> list = new ArrayList<SelectItem>(); 
    for (COSOptionType cos : COSOptionType.values()) { 
     SelectItem item = new SelectItem(); 
     item.setLabel(cos.toString()); 
     item.setValue("" + cos.ordinal()); 
     list.add(item); 
    } 
    return list; 
} 

왜 "유효성 검사 오류"가 발생하는지 이해할 수 없습니까? 내가 디버그하고 컨버터가 잘 작동하는지 볼 수 있습니다.

NOTE: I am using JSF 1.1 

답변

4

item.setValue("" + cos.ordinal()) 대신 item.setValue(cos)을 시도하십시오.

+0

이렇게하면 문제가 해결됩니다. 고맙습니다. – Shamik

+0

이상하게도 변환기의 getAsString()은 완전히 똑같습니다. – BalusC

+0

근본 원인은 변환기가 getAsObject()에서' ""+ cos.ordinal() "대신"COSOptionType "을 반환한다는 것입니다. 따라서 기존 옵션에는 전혀 나타나지 않습니다. – BalusC

5

근본적인 원인은 "" + cos.ordinal()getAsObject()에있는 대신 COSOptionType 문자열을 반환하기 때문에 기존 옵션에 전혀 나타나지 않습니다.

이 방법은 특히 enum과 변환기가 복잡합니다.

Option :

package com.example; 

public enum Option { 

    NOTAPPLICABLE("Not Applicable"), 
    OPTIONAL("Optional"), 
    MANDATORY("Mandatory"); 

    private String label; 

    private Option(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

} 

Bean :

package com.example; 

import java.util.ArrayList; 
import java.util.List; 

import javax.faces.model.SelectItem; 

public class Bean { 

    private List<SelectItem> options = new ArrayList<SelectItem>(); 
    private Option option; 

    public Bean() { 
     for (Option option : Option.values()) { 
      options.add(new SelectItem(option, option.getLabel())); 
     } 
    } 

    public void submit() { 
     System.out.println(option); 
    } 

    public List<SelectItem> getOptions() { 
     return options; 
    } 

    public Option getOption() { 
     return option; 
    } 

    public void setOption(Option option) { 
     this.option = option; 
    } 

} 

OptionConverter :

package com.example; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 

public class OptionConverter implements Converter { 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     return Option.valueOf(value); 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     return ((Option) value).name(); 
    } 

} 

faces-config.xml : 나는 다음과 같이이 방법을 재고하는 것이 좋습니다

JSF 페이지의3210
<managed-bean> 
    <managed-bean-name>bean</managed-bean-name> 
    <managed-bean-class>com.example.Bean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

<converter> 
    <converter-class>com.example.OptionConverter</converter-class> 
    <converter-for-class>com.example.Option</converter-for-class> 
</converter> 

관련 부분 :

<h:form> 
    <h:selectOneMenu value="#{bean.option}">           
     <f:selectItems value="#{bean.options}" /> 
    </h:selectOneMenu> 
    <h:commandButton value="submit" action="#{bean.submit}" /> 
    <h:messages /> 
</h:form> 

악으로 간주됩니다 Enum#ordinal()과 번거 로움 필요가 없습니다.

내장형 EnumConverter과 함께 제공되는 JSF 1.2 이상을 사용하는 경우 OptionConverter은 완전히 불필요하므로 안전하게 제거 할 수 있습니다.

관련 문제