Sau khi đọc nhận xét của BalusC, tôi đang cập nhật bài đăng này một lần nữa.
Tôi đã tạo một ứng dụng trình diễn nhỏ và xem các giai đoạn và thời điểm chuyển đổi và xác thực xảy ra.
Xem:
<h:form>
<h:inputText value="#{demoBean.field}">
<f:converter converterId="demoConverter"/>
<f:validator validatorId="demoValidator"/>
</h:inputText>
<h:commandButton value="Submit" action="#{demoBean.demoAxn()}"/>
</h:form>
Managed đậu:
@ManagedBean
@SessionScoped
public class DemoBean implements Serializable {
private String field;
public DemoBean() {
System.out.println(Thread.currentThread().getStackTrace()[1]);
}
public String getField() {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return field;
}
public void setField(String field) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
this.field = field;
}
public String demoAxn() {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return null;
}
}
Chuyển đổi:
@FacesConverter(value="demoConverter")
public class DemoConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return value;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return (String) value;
}
}
Validator:
@FacesValidator(value="demoValidator")
public class DemoValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
System.out.println(Thread.currentThread().getStackTrace()[1]);
}
}
Giai đoạn nghe:
public class DemoPhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
System.out.println("PhaseId: " + event.getPhaseId() + " ===============================\n\n");
}
@Override
public void beforePhase(PhaseEvent event) {
System.out.println("\n\nPhaseId: " + event.getPhaseId() + " ===============================");
System.out.println(Thread.currentThread().getStackTrace()[1]);
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
đăng ký giai đoạn nghe:
<lifecycle>
<phase-listener>pkg.DemoPhaseListener</phase-listener>
</lifecycle>
Với thiết lập rằng khi "Gửi" nút được nhấn vào, đầu ra là:
INFO: PhaseId: RESTORE_VIEW 1 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: RESTORE_VIEW 1 ===============================
INFO: PhaseId: APPLY_REQUEST_VALUES 2 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: APPLY_REQUEST_VALUES 2 ===============================
INFO: PhaseId: PROCESS_VALIDATIONS 3 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoConverter.getAsObject(DemoConverter.java:13)
INFO: pkg.DemoValidator.validate(DemoValidator.java:14)
INFO: pkg.DemoBean.getField(DemoBean.java:17)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: PROCESS_VALIDATIONS 3 ===============================
INFO: PhaseId: UPDATE_MODEL_VALUES 4 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoBean.setField(DemoBean.java:22)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: UPDATE_MODEL_VALUES 4 ===============================
INFO: PhaseId: INVOKE_APPLICATION 5 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoBean.demoAxn(DemoBean.java:27)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: INVOKE_APPLICATION 5 ===============================
INFO: PhaseId: RENDER_RESPONSE 6 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoBean.getField(DemoBean.java:17)
INFO: pkg.DemoConverter.getAsString(DemoConverter.java:20)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: RENDER_RESPONSE 6 ===============================
Nhưng khi thực hiện thay đổi để ném NPE vào bộ chuyển đổi như sau:
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
throw new NullPointerException();
}
đầu ra là:
INFO: PhaseId: RESTORE_VIEW 1 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: RESTORE_VIEW 1 ===============================
INFO: PhaseId: APPLY_REQUEST_VALUES 2 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: APPLY_REQUEST_VALUES 2 ===============================
INFO: PhaseId: PROCESS_VALIDATIONS 3 ===============================
INFO: pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
INFO: pkg.DemoConverter.getAsObject(DemoConverter.java:13)
INFO: pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
INFO: PhaseId: PROCESS_VALIDATIONS 3 ===============================
INFO: pkg.DemoBean.getField(DemoBean.java:17)
Nhưng stacktrace được hiển thị trên xem kết quả.
Cảm ơn @BalusC. Mặc dù đến sau này và về cơ bản tóm tắt cuộc trò chuyện dài gắn liền với câu trả lời của βнɛƨн Ǥʋяʋиɢ (mà tôi đã chấp nhận), tôi muốn câu trả lời hữu ích nhất là câu trả lời được chấp nhận vì lợi ích của những người khác gặp phải câu hỏi này. Xin lỗi βнɛƨн Ǥʋяʋиɢ :( –
Bạn được hoan nghênh, xin lưu ý rằng tôi đã cập nhật câu trả lời sau khi xem xét kỹ hơn việc triển khai trình duyệt tính hợp lệ của bạn về cơ bản là sai. – BalusC
@BalusC: Cảm ơn bạn đã sửa lỗi. Câu trả lời của tôi –