JSF的backing bean关联问题

今天上手写了一个超级超级简单的JSFpage, 被backing managed bean问题卡了两个小时,呼~终于搞定了。记录一下吧。

看oracle教程里的示例程序,对JSF里EL变量可以直接对应到java class,比如说FooBean类可以在JSF page里面通过#{fooBean}直接访问(此处注意大小写)。

我的xhmtl代码如下:

<h:body>
        <h:form>
            <h:inputText id="userName" title="Enter your user name:" value="#{userNameBean.userName}"></h:inputText>
            <h:commandButton id="login" value="Login" action="result" />
        </h:form>
    </h:body>

我的类代码如下:

@Named
@SessionScoped
public class UserNameBean implements Serializable{
    String userName;

    public UserNameBean() {
        this.userName = null;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }
}

这么简单得不能再简单的代码居然运行报错。。。
刚开始报的错是jsf 2.2 - Target Unreachable, identifier “userNameBean” resolved to null in JSF.
好吧,应该是CDI没有正确map userNameBean到UserNameBean类。查了一下官方文档,这个default确实应该就是map到首字母大写的类名啊。
再试试把@Named改成@Named(“userName”), 在JSF里也改成#{userName.userName”), 居然通过了。
仔细想了一想,没道理啊。怎么可能一定要explicitly指定成其它的名字呢,太奇怪了。再回过去,居然deploy报错,非常莫须有的错:

nbproject\build-impl.xml:1045:尚未部署该模块 构建失败

网上查了一下资料,说要先check一下source有没有正确的被编译到正确的位置。

我的这个java类应该会把编译好的包放到这样的一个目录下:

C:\Users\Xin\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\classes

奇怪的是这个目录下有两个文件夹:

  • C:\Users\Xin\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\classes\ webapplication1

  • C:\Users\Xin\Documents\NetBeansProjects\WebApplication1\build\web\WEB-INF\classes\ webapplication

webapplication1是我之前创建的一个package的名字,后来全部移到webapplication包了,怎么会没有删除呢。我试着删除了webapplication1文件夹,运行正确!!

可是问题是,再一次clean build run,会再一次生成webapplication1文件夹。在项目目录里全局搜索了一下webapplication1,已经没有匹配了。会不会是netbeans IDE的缓存啥的还留有之前的错误名字呢,导致冲突呢?那我是不是应该用package的重命名(rename),而不是之前的移动(move to correct folder)呢?

按照这个思路,把现在package重命名为webapplication1,clean build run. 通过!! Double check一下build目录,没有多余的package生成,终于解决了!

posted @ 2018-03-05 20:28  kkkchan  阅读(402)  评论(0)    收藏  举报