Почему изменение определения моего управляемого компонента приводит к тому, что конструктор не вызывается?

Пожалуйста, взгляните на следующую страницу 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="&#160;" />

    <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

Различия журнала 1

Различия журнала 2

1 ответ

Решение

Этот вопрос никогда не был решен. Это было сделано, чтобы уйти, воссоздав проект Eclipse с нуля; Одновременное обновление до JSF 2.3 / CDI 1.2.

Другие вопросы по тегам