2012-07-25 23 views
8

Tôi đang làm việc với JSF 2.0, JBoss 7.1.1 Final và tôi gặp sự cố sau với selectOneMenu. Tôi muốn có thể thiết lập một trường trong bean được quản lý thành true/false/null. Vì vậy, tôi đã tạo ra sau selectOneMenu:h: selectOneMenu với các mục boolean không hoạt động với giá trị null

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="true" itemLabel="Yes"/> 
    <f:selectItem itemValue="false" itemLabel="No"/> 
</h:selectOneMenu> 

Bây giờ, nếu tôi chọn 'Bất kỳ ..', nó sẽ gán "false" vào lĩnh vực registrationComplete (đó là Boolean). Vì vậy, null được hiểu là sai. Tôi cũng cố gắng sử dụng các giá trị boolean trong selectItem (s), đó là:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/> 
    <f:selectItem itemValue="#{false}" itemLabel="No"/> 
</h:selectOneMenu> 

Và tôi cũng đăng ký chuyển đổi trên khuôn mặt-config như sau:

<converter> 
    <converter-id>booleanConverter</converter-id> 
    <converter-class>javax.faces.convert.BooleanConverter</converter-class> 
</converter> 

và cố gắng sử dụng nó:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="true" itemLabel="Yes"/> 
    <f:selectItem itemValue="false" itemLabel="No"/> 
     <f:converter converterId="booleanConverter"/> 
</h:selectOneMenu> 

Nhưng tất cả những nỗ lực này dẫn đến hành vi tương tự - khi giá trị null được chọn, nó được hiểu là sai.

Tôi đã sửa lỗi và theo dõi ngăn xếp Tôi đã tìm thấy vị trí xảy ra. Trong AstValue.setValue(EvaluationContext, Object) line: 204

nó gọi

ELSupport.coerceToType(value, targetClass) 

tham số giá trị là null và targetClass là Boolean. Phương thức coerceToType này sau đó trả về false.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này? Cảm ơn!

+0

chữ ký của phương pháp() setRegistrationComplete là gì? Loại đối số là gì? Boolean hoặc boolean? – prageeth

+0

@prageeth: OP đã nêu rõ 'Boolean'. – BalusC

+0

@prageeth là bộ trống công cộng được hoàn thành (Boolean registrationComplete). Và lĩnh vực đăng kýComplete là Boolean – lukas

Trả lời

8

Điều này là điển hình cho trình phân tích cú pháp Apache EL được Tomcat và JBoss sử dụng. Nó được biết là không phân biệt giữa nguyên thủy và biểu diễn đối tượng bao bọc của nó khi co giật các giá trị null trong EL. Các loại trình bao bọc luôn được coi là nguyên thủy. Nó hoạt động tốt trong Glassfish, ví dụ.

Bạn có thể tắt này Apache EL phân tích cú pháp hành vi bằng cách thêm đối số VM sau để kịch bản khởi động máy chủ của bạn:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false 
Các vấn đề liên quan