为什么改变我的托管bean的定义导致构造函数没有被调用?

时间:2018-04-18 00:15:07

标签: java-8 jsf-2.2 tomcat8 mojarra eclipse-oxygen

请查看以下JSF页面以及它引用的托管bean类的定义。

当我运行我的应用程序并加载页面时,我得到“好结果”屏幕截图中显示的结果。请注意,页面显示数据,并且bean的构造函数打印的“Hello World”字符串出现在控制台中。

如果我通过注释掉“垃圾”整数的定义(靠近顶部)来改变bean的定义,那么我会得到“错误结果”屏幕截图中显示的结果。现在没有数据,而且最明显的是,“Hello World”字符串没有出现在控制台中。没有错误报告给控制台。该页面正在呈现,但似乎JSF引擎已决定它不喜欢bean的定义,因此不会使用它(不会调用构造函数)。

我已经大力尝试制作Minimal, Complete, and Verifiable example。我从JSF页面中删除了几个表单(您可以观察到JSF页面不再引用bean的大部分代码)。我通过创建DummyDataAccessService类从图片中删除了JPA。我试图消除一个或多个我自己的自定义类(Order,Patient,Product,DataAccessService和DummyDataAccessService)的使用,但我不能:几乎任何对bean定义的更改都会产生与删除定义相同的奇怪行为“垃圾”成员变量。

我创建了一个自定义logging.properties文件,该文件将级别提升为ALL。 Good与Bad案例产生的日志记录差不多。下面的两个“记录差异”屏幕截图显示了主要区别。

我不知道如何进一步探讨这个问题。我甚至不知道猜测可能会发生什么。任何关于行动方案的线索或建议将不胜感激。

JSF页面

<!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>

订购控制器托管Bean

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;
        }
    });
}
}

效果好

Good Results

结果不佳

Bad Results

记录差异1

Log Differences 1

记录差异2

enter image description here

1 个答案:

答案 0 :(得分:0)

这个问题从未解决过。它是通过从头重新创建Eclipse项目而消失的;同时升级到JSF 2.3 / CDI 1.2。