2012-03-19 50 views
27

Tôi đã nâng cấp ứng dụng web Java EE của mình để sử dụng phiên bản PrimeFaces mới hơn và đột nhiên cuộc gọi của phương thức bean quá tải trong một thuộc tính hành động của lệnh PrimeFaces không hoạt động nữa. Tôi đã cố gắng sử dụng liên kết lệnh mặc định JSF để kiểm tra nó và điều này cũng không hoạt động.EL có hỗ trợ các phương pháp quá tải không?

Chữ ký phương pháp như sau:

public void updateA(B b); 
public void updateA(A a); 

Nó luôn cố gắng đúc A đến B.

tò mò hơn, làm thế nào nó có thể làm việc trước khi nâng cấp?

Trả lời

32

EL không hỗ trợ, không. Nó sẽ luôn là phương pháp đầu tiên của mảng Class#getMethods() có tên (và số lượng đối số) khớp với cuộc gọi phương thức EL. Cho dù nó trả về cùng một phương thức mọi lúc hay không phụ thuộc vào việc tạo/phiên bản JVM được sử dụng. Có lẽ bạn đã thực hiện nâng cấp Java SE trong khi đó. Các javadoc thậm chí nói điều này:

các yếu tố trong mảng được trả về không được sắp xếp và đang không ở trong bất kỳ thứ tự cụ thể.

Bạn không nên dựa vào hành vi không xác định. Đặt cho họ một cái tên khác.

+0

Xin cảm ơn, lời giải thích của bạn làm rõ mọi thứ bây giờ – djmj

+1

Có lý do nào (kỹ thuật) tại sao điều này không được hỗ trợ trong JSF 2 nữa không? Tôi khá chắc chắn rằng điều này là có thể trong các phiên bản JSF 1.x, phải không? – MrD

+0

Đây không phải là JSF cụ thể. – BalusC

5

Cách bạn có thể thực hiện việc này là tạo phương pháp chung và thực hiện 'định tuyến' bên trong phương thức đó. Tôi biết rằng điều này có thể không lý tưởng, nhưng bạn kết thúc với ít cấu hình hơn trong các chức năng và các trang XHTML.

if (A.class.isInstance(obj)) { 
    A o = (A) obj; 
    return method(o, highRes); 
} else if (B.class.isInstance(obj)) { 
    B o = (B) obj; 
    return method(o, highRes); 
} else if (C.class.isInstance(obj)) { 
    C o = (C) obj; 
    return method(o, highRes); 
} else { 
    throw new FacesException("Unsupported Conversion: " + obj); 
} 
Các vấn đề liên quan