2014-04-14 10 views
1

를 저장하지SelectManyBox - 열거 형은 .. 난 아직도 selectManyCheckBox에 문제가

selectManyCheckBox : 여기에 설명 된대로

이 selectManyCheckBox에 대한
<p:selectManyCheckbox converter="genericEnumConverter" value="#{aView.newObject.aValue}">           
     <f:selectItems value="#{enumBean.aValueValues}" var="s" itemValue="#{s}" itemLabel = "#{s.name}"/> 
</p:selectManyCheckbox> 

컨버터는 동일합니다 Use enum in h:selectManyCheckbox

@FacesConverter("genericEnumConverter") 
public class GenericEnumConverter implements Converter { 

    private static final String ATTRIBUTE_ENUM_TYPE = "GenericEnumConverter.enumType"; 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     System.out.println("getAsString 1: "); 
     if (value instanceof Enum) { 
      System.out.println("getAsString 2: "); 
      component.getAttributes().put(ATTRIBUTE_ENUM_TYPE, value.getClass()); 
      System.out.println("getAsString 3: "); 
      return ((Enum<?>) value).name(); 
     } else { 
      System.out.println("getAsString 4: "); 
      throw new ConverterException(new FacesMessage("Value is not an enum: " + value.getClass())); 
     }   
    } 

    @Override 
    @SuppressWarnings({"rawtypes", "unchecked"}) 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     System.out.println("getAsObject 1: "); 
     Class<Enum> enumType = (Class<Enum>) component.getAttributes().get(ATTRIBUTE_ENUM_TYPE); 
     System.out.println("getAsObject 2: "); 
     try { 
      System.out.println("getAsObject 3: "); 
      return Enum.valueOf(enumType, value); 
     } catch (IllegalArgumentException e) { 
      System.out.println("getAsObject 4: "); 
      throw new ConverterException(new FacesMessage("Value is not an enum of type: " + enumType)); 
     } 
    } 

열거 형 :

public enum aValue { 

     1Value, 
     2Value, 
     3Value, 
     4Value; 
     private final String name; 

     private aValue() { 
      System.out.println("aValue 1"); 
      this.name = null; 
      System.out.println("aValue 2"); 
     } 

     public String getName() { 
      System.out.println("getName 1 " + name()); 
      return ResourceBundleUtil.getLabelFromRb("aValue." + name()); 
     } 
    } 

    public aValue[] getAValueValues() { 
     return AValue.values(); 
    } 

톰캣 로그는 다음과 같습니다

aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
aValue 1 
aValue 2 
getName 1Value 
getName 2Value 
getName 3Value 
getName 4Value 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getName 1Value 
getName 2Value 
getName 3Value 
getName 4Value 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 
getAsString 1: 
getAsString 2: 
getAsString 3: 

내가 저장 버튼을 누르면 아무 일도 발생하지 않습니다 아무것도는 데이터베이스에 저장되지 않습니다. getAsObject 메소드에 들어 가지 않는 것 같습니다. 나는 이유를 모른다. 구성 요소를 SelectOneMenu로 변경하면 아무런 문제가 없습니다. 그러나이 selectManyCheckBox 것은 작동하지 않습니다. 누구 아이디어가 있습니까?

+0

'p : commandButton'을 사용하는 경우'ajax = "false"'속성을 추가하고 검사 이벤트가 발생하는지 여부를 확인하십시오. – pudaykiran

+1

상황에 대한 나의 승인은 javax.faces.component.UIinput의 processDecodes (FacesContext context)와 getConvertedValue (context, submittedValue)에 중단 점을 넣고 자세한 대답을위한 요청 매개 변수 –

답변

2

귀하의 문제는 여기에 있습니다 : 당신이 얻을 수있는 입력 요소의 value 속성을 결합하고

<p:selectManyCheckbox ... value="#{aView.newObject.aValue}"> 

가/단일 값을 나타내는 속성에 여러 값을 설정합니다. 이것은 효과가 없을 것입니다. value 속성을 단일 속성 aValue 대신 컬렉션 (예 : List<aValue>) 또는 배열 (예 : aValue[]) 속성에 바인딩해야합니다.

public class NewObject { 

    private List<aValue> aValues; 

    // ... 
} 

달리,

<p:selectManyCheckbox ... value="#{aView.newObject.aValues}"> 

하거나 :

public class NewObject { 

    private aValue[] aValues; 

    // ... 
} 

<p:selectManyCheckbox value="#{aView.newObject.aValues}"> 
와 예

배열을 사용할 때 전체 변환기는 이 아니며이 필요하지 않습니다. omnifaces.GenericEnumConverter showcase page을 참조하십시오. 일반 클래스와 인터페이스, 열거 클래스 이름으로 너무 aValue처럼 정말 나쁜 선택처럼 자바 명명 규칙에 따라 구체적인 문제에 관련없는


는 열거 클래스 이름은 대문자로 시작해야합니다. 그런데 헝가리 표기법은 Java에서는 실망하고 있습니다.


업데이트 : 그 작업을 증명하기는 여기 SSCCE입니다.

열거 형 :

public enum Value { 

    ONE, TWO, THREE; 

    public String getName() { 
     return name().toLowerCase(); 
    } 

} 

엔티티 :

public class Entity { 

    private Value[] values; 

    public Value[] getValues() { 
     return values; 
    } 

    public void setValues(Value[] values) { 
     this.values = values; 
    } 

} 

의 관리 빈 :

@ManagedBean 
@RequestScoped // Note: @ViewScoped works as well on this SSCCE. 
public class Bean { 

    private Entity entity; 

    @PostConstruct 
    public void init() { 
     entity = new Entity(); 
    } 

    public void submit() { 
     System.out.println(Arrays.toString(entity.getValues())); 
    } 

    public Entity getEntity() { 
     return entity; 
    } 

    public Value[] getAvailableValues() { 
     return Value.values(); 
    } 

} 

(모든 변환없이!) 뷰 :

<h:form> 
    <p:selectManyCheckbox value="#{bean.entity.values}"> 
     <f:selectItems value="#{bean.availableValues}" var="value" 
      itemValue="#{value}" itemLabel="#{value.name}" /> 
    </p:selectManyCheckbox> 
    <p:commandButton value="Submit" action="#{bean.submit}" /> 
</h:form> 

그것은 나를 위해 잘 작동합니다 (Mojarra 2.1.28 + PrimeFaces 4.0,하지만 이전의 모든 버전에서 작동해야하며이 구조는 이전에 버그가없는 것으로 알려져 있습니다).

+0

을 찾도록하는 것입니다. 배열을 사용해 보았지만 작동하지 않았습니다. 출력은 다음과 같습니다 : http://codeshare.io/tTJDY 다음과 같이 코드를 변경했습니다 : http://codeshare.io/O7eNb – lamostreta

+0

글쎄, 분명히'# {aView.newObject}'는'null'이거나 입력 단순히 아약스 프로세스에 의해 커버되지 않습니다. 진정한 SSCCE를 보지 않고도 말하기가 어렵습니다. – BalusC

+0

참고 : 원래 코드에서 Java 명명 규칙을 따랐습니다. 그러나 여기서 코드를 전송할 때 실수를했습니다. 어쨌든 고마워요 :) – lamostreta