Maven 使用<;h:头>;在提交时导致EvaluationException,但使用标准正确执行<;头>;

Maven 使用<;h:头>;在提交时导致EvaluationException,但使用标准正确执行<;头>;,maven,jsf,glassfish,cdi,java-ee-7,Maven,Jsf,Glassfish,Cdi,Java Ee 7,开发环境 <?xml version='1.0' encoding='UTF-8' ?> <!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.

开发环境

<?xml version='1.0' encoding='UTF-8' ?>
<!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">

<body>

    <ui:composition template="./layouts/anonymous.xhtml">

        <ui:define name="left_side">
            <h:form>
                <div>
                    <h:inputText class="form-control" id="username" value="#{loginController.username}" />
                    <h:outputLabel value="User Name:" />
                </div>
                <div class="form-group">
                    <h:inputSecret class="form-control" id="password" value="#{loginController.password}" />
                    <h:outputLabel value="Password:" />
                </div>
                <br />
                <div>
                    <h:commandButton class="btn btn-primary btn-raised" action="#{loginController.logUserIn()}" value="Login" >
                            <f:ajax />
                    </h:commandButton>
                </div>
            </h:form>
        </ui:define>

        <ui:define name="right_side">
            <h:messages />
        </ui:define>

    </ui:composition>

</body>
</html>
  • 1.8.0_45 JDK
  • Glassfish 4.1(最新版本)
  • Maven 3.3.3
  • NetBeans 8.0.2
  • MS SQL 2012
项目详细信息

  • Maven企业应用程序
  • 2个EJB
  • 1 WAR(Glassfish提供的JSF2.2库)
  • 耳部署
问题陈述

<?xml version='1.0' encoding='UTF-8' ?>
<!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">

<body>

    <ui:composition template="./layouts/anonymous.xhtml">

        <ui:define name="left_side">
            <h:form>
                <div>
                    <h:inputText class="form-control" id="username" value="#{loginController.username}" />
                    <h:outputLabel value="User Name:" />
                </div>
                <div class="form-group">
                    <h:inputSecret class="form-control" id="password" value="#{loginController.password}" />
                    <h:outputLabel value="Password:" />
                </div>
                <br />
                <div>
                    <h:commandButton class="btn btn-primary btn-raised" action="#{loginController.logUserIn()}" value="Login" >
                            <f:ajax />
                    </h:commandButton>
                </div>
            </h:form>
        </ui:define>

        <ui:define name="right_side">
            <h:messages />
        </ui:define>

    </ui:composition>

</body>
</html>
当我使用标准的
标记时,一切都正常工作。我的CDI工作,值被处理,站点做它应该做的事情。但是,如果我使用了预期的
标记,我的代码就不会执行,我会收到一个
javax.faces.FacesException:#{loginController.logUserIn()}:javax.ejb.EJBException

面模板

<?xml version='1.0' encoding='UTF-8' ?> 
<!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">

<head>
    <title>Learning Resource Mapping Utility</title>
    ... <!-- stylesheets loaded here -->
</head>
<body>
    <ui:insert name="left_side"></ui:insert>
    <ui:insert name="right_side"></ui:insert>

    </body>
</html>
package org.eta.lrm.controllers;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.persistence.PersistenceException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.eta.lrm.entities.Person;
import org.eta.web.util.JsfUtil;

@Named(value = "loginController")
@SessionScoped
public class LoginController implements Serializable {

private static final long serialVersionUID = 2701463947668608540L;

@EJB
private org.eta.lrm.models.PersonFacadeLocal userFacade;
private String username;
private String password;
private Person user;
private boolean authenticated = false;

//<editor-fold defaultstate="collapsed" desc="PROPERTIES">

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public Person getUser() {
    return user;
}

public void setUser(Person user) {
    this.user = user;
}

public boolean isAuthenticated() {
    return authenticated;
}

public void setAuthenticated(boolean authenticated) {
    this.authenticated = authenticated;
}

//</editor-fold>

public String logUserIn() {

    // set a default result to return
    String result = "/login";

   try {
       this.user = userFacade.findByUsername(username);
   } catch (PersistenceException pEx) {
       Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, pEx);
       JsfUtil.addErrorMessage("Username not found, please try again.");
       return result;
   }       

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

    try {
        request.login(this.getUsername(), this.getPassword());
        this.authenticated = true;
        result = "/staff/dashboard?faces-redirect=true";
    } catch (ServletException ex) {
        Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        JsfUtil.addErrorMessage("Login failed, please try again.");
        result = "/login";
    }

    // redirect user to the result destination
    return result;
    }

}

使用
标记时,不会发生任何堆栈跟踪。只有
标记。

h:head的lackof使ajax标记发出警告。它需要将脚本添加到仅适用于h:head,而不是普通head的head。当这开始工作时,按下按钮时,很可能其中一个输入没有发送到服务器,从而导致代码执行。错误的原因显而易见,因此请调查返回noresults的原因

Caused by: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities.
at org.eclipse.persistence.internal.jpa.QueryImpl.throwNoResultException(QueryImpl.java:972)
at org.eclipse.persistence.internal.jpa.QueryImpl.getSingleResult(QueryImpl.java:522)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getSingleResult(EJBQueryImpl.java:400)
at org.eta.lrm.models.PersonFacade.findByUsername(PersonFacade.java:40)
最有可能的是,更正ajax标记(确保它“执行”其他输入(默认值为@this afaik))将使其工作


事实上,您的问题是afaics的副本(如果您试图找出此特定异常发生的原因,您可能会发现此问题(我们将返回阅读stacktraces;-)

发布完整的stacktrace,请从您的帖子中删除所有不相关的代码。像所有javascript加载之类的事情。。。我已经做了建议的更改。然而,我最初发布了所有这些,因为我没有问题让其他网站使用;只是不是这个。所以我认为这是我放在错误的区域或其他格式问题。谢谢你的反馈,但这不是问题所在。我想问的是,为什么将
标记更改为
标记会导致该特定错误。网站在
标签下完美运行;包括检索上述错误中标识的SingleResult()。事实上,使用
head
标记时不会出现错误。我需要找出为什么简单地将
标记更改为
和匹配的结束标记会导致出现
javax.persistence.NoResultException
。代码隐藏且数据未更改;只是标记。是的,但是当添加h:head时,最有可能发生变化的是f:ajax开始工作(这需要将脚本添加到head,它只与h:head一起工作,而不与head一起工作,并导致您在使用plain head时收到警告(对不起,我的平板电脑上没有反勾号)。当您添加stacktrace时,由于方法的原因,我更清楚地指向了该部分。因此,您必须检查为什么在使用ajax时,其中一个输入的值很可能没有发送到服务器(我认为mssing值会导致异常)。检查在ajax标记上为execute属性添加正确的值是否解决了此问题。添加
解决了此问题。谢谢Kukeltje。不客气。并尝试找出导致警告的组件可能为您指明了正确的方向(关于在so中搜索的内容)