Почему изменение определения моего управляемого компонента приводит к тому, что конструктор не вызывается?
Пожалуйста, взгляните на следующую страницу JSF и на определение класса управляемого компонента, на который он ссылается.
Когда я запускаю свое приложение и загружаю страницу, я получаю результаты, показанные на снимке экрана "Хорошие результаты". Обратите внимание, что на странице отображаются данные и что строка "Hello World", напечатанная конструктором компонента, появляется в консоли.
Если я изменю определение бина, закомментировав определение целого числа "мусор" (около верха), я получу результаты, показанные на снимке экрана "Плохие результаты". Теперь нет данных, и, что наиболее показательно, строка "Hello World" не появляется в консоли. Об ошибках не сообщается на консоль. Страница отображается, но кажется, что движок JSF решил, что ему не нравится определение компонента, и поэтому он не будет его использовать (конструктор не вызывается).
Я очень старался привести минимальный, полный и проверяемый пример. Я удалил несколько форм со страницы JSF (вы можете заметить, что на большую часть кода компонента больше не ссылается страница JSF). Я исключил JPA из картинки, создав класс DummyDataAccessService. Я пытался исключить использование одного или нескольких своих собственных пользовательских классов (Order, Patient, Product, DataAccessService и DummyDataAccessService), но не смог: почти любое изменение определения компонента вызывает такое же странное поведение, которое возникает в результате удаления определения переменной-члена "нежелательной".
Я создал собственный файл logging.properties, который повысил уровень до ВСЕГО. Регистрация, производимая случаями "Хорошо против", была почти одинаковой. Два снимка экрана "Различия по протоколированию" ниже показывают основные различия.
Я не знаю, как исследовать это дальше. Я не знаю достаточно, чтобы даже предположить, что может происходить. Любая подсказка или рекомендация относительно курса действий будет принята с благодарностью.
JSF Page
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<h:outputStylesheet library="default" name="css/style.css" />
<title>Managed Bean Problem</title>
</h:head>
<h:body>
<h3 class="title">Managed Bean Problem</h3>
<h:outputText value=" " />
<table align="center" width="600">
<tr><td><h:form>
<h:dataTable value="#{orderController.table}" var="order" styleClass="demo" columnClasses="columns, columns">
<h:column>
<f:facet name="header">
<h:column>
<h:outputText value="Patient"></h:outputText>
</h:column>
</f:facet>
<h:outputText value="#{order.patient.fullName}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:column>
<h:outputText value="Product"></h:outputText>
</h:column>
</f:facet>
<h:outputText value="#{order.product.name}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:column>
<h:outputText value="Actions"></h:outputText>
</h:column>
</f:facet>
<h:panelGrid columns="1">
<h:commandLink value="delete" action="#{orderController.delete}">
<f:setPropertyActionListener target="#{orderController.target}" value="#{order}" />
</h:commandLink>
</h:panelGrid>
</h:column>
</h:dataTable>
</h:form></td></tr>
</table>
</h:body>
Контроллер заказов Управляемый компонент
package com.rvaessen.dmescripts.controllers;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.model.SelectItem;
import com.rvaessen.dmescripts.model.*;
@ManagedBean
public class OrderController {
private int junk; // Leave it in; Good. Comment it out; Bad.
private DataAccessService dataService = new DummyDataAccessService();
public OrderController() {
System.out.println("Hello, World");
}
@PostConstruct
public void init() {
initPatients();
initProducts();
initOrders();
}
// ********************************* The Orders Table ***************************************
private Order target;
private List<Order> table;
private void initOrders() { table = dataService.getOrders(); }
public List<Order> getTable() { return table; }
public void setTarget(Order order) { target = order; }
public String delete() {
dataService.removeOrder(target);
table.remove(target);
return null;
}
// ********************************* Add New Order ***************************************
// NOTE: The Add New Order methods are no longer referenced by the JSF page
private Order newOrder;
public String addNew() {
newOrder = new Order();
return null;
}
public String save() {
dataService.addOrder(newOrder, patient, product);
table.add(newOrder);
cancel();
return null;
}
public String cancel() {
newOrder = null;
return null;
}
public boolean getAddingNew() { return newOrder != null; }
/************************ The Patients Menu **********************************/
// NOTE: The Patients Menu methods are no longer referenced by the JSF page
private Patient patient;
private List<Patient> patients;
private void initPatients() {
patients = dataService.getPatients();
if (patients.size() > 0) patient = patients.get(0);
}
public List<SelectItem> getPatients() {
List<SelectItem> list = new ArrayList<SelectItem>();
patients.forEach(patient -> list.add(new SelectItem(patient.getId(), patient.getFullName())));
return list;
}
public Long getPatientId() {
return patient == null ? 0 : patient.getId();
}
public void setPatientId(Long id) {
patients.forEach(patient -> {
if (patient.getId() == id) {
this.patient = patient;
}
});
}
/************************ The Products Menu **********************************/
// NOTE: The Products Menu methods are no longer referenced by JSF page
private Product product;
private List<Product> products;
private void initProducts() {
products = dataService.getProducts();
if (products.size() > 0) product = products.get(0);
}
public List<SelectItem> getProducts() {
List<SelectItem> list = new ArrayList<SelectItem>();
if (patient != null) {
products.forEach(product -> {
if (product.getInsurance().equals(patient.getInsurance())) {
list.add(new SelectItem(product.getId(), product.getName()));
}
});
}
return list;
}
public Long getProductId() {
return product == null ? 0 : product.getId();
}
public void setProductId(Long id) {
products.forEach(product -> {
if (product.getId() == id) {
this.product = product;
}
});
}
}
Хорошие результаты
Плохие результаты
Различия журнала 1
Различия журнала 2
1 ответ
Этот вопрос никогда не был решен. Это было сделано, чтобы уйти, воссоздав проект Eclipse с нуля; Одновременное обновление до JSF 2.3 / CDI 1.2.