<h:inputFile /> ajax 上传错误:未定义 partialResponse
Error on <h:inputFile /> ajax upload: partialResponse is not defined
应用程序需要导入 excel 个文件 (.xlsx) 来填充一个数据库 table。当我尝试通过 AJAX 上传文件时出现问题。永远不会调用验证器(也永远不会调用侦听器)。当我尝试上传文件时,JSF AJAX JavaScript 文件抛出错误并显示在浏览器的控制台中:TypeError: partialResponse is not defined
.
我的第一个想法是这是一个错误,但我不确定。这是我的第一个 JSF 项目。
<h:form id="travels-form" class="toolbar ui form" enctype="multipart/form-data">
<div class="five wide field">
<input type="text" id="search" placeholder="Buscar..." />
</div>
<div class="actions">
<div class="inline field wide">
<h:selectOneMenu valueChangeListener="#{travelBean.filter}" >
<f:selectItem itemValue="" itemLabel="Todas las placas" />
<f:selectItems value="#{travelBean.licensePlates}" var="plate"
itemValue="${plate}" itemLabel="${plate}" />
<f:ajax execute="@this" render=":tblTravels" />
</h:selectOneMenu>
</div>
<h:outputLabel for="excel" value="Excel" styleClass="ui positive button" />
<h:inputFile id="excel" value="#{excelImporterBean.workbook}"
validator="#{excelImporterBean.validate}"
style="display: none">
<f:ajax execute="@this" render="excelMessage :tblTravels"
listener="#{excelImporterBean.onLoadWorkbook}"/>
</h:inputFile>
<h:message id="excelMessage" for="excel" errorClass="error-message"/>
<h:outputLink value="#{request.contextPath}/home/recorridos/nuevo"
styleClass="ui primary button">
Registrar
</h:outputLink>
</div>
</h:form>
这是 ExcelImporterBean 方法(验证器和侦听器):
public void onLoadWorkbook(AjaxBehaviourEvent ev) {
excelImporter.importWorkbook(workbook);
}
public void validate(FacesContext ctx, UIComponent comp, Object value) {
FacesMessage message = null;
Part _workbook = (Part) value;
if(((Part) value).getContentType().equals(EXCEL_TYPE)) {
message = new FacesMessage("Solo archivos excel 2007+ (.xlsx)");
}
if(message != null) {
throw new ValidatorException(message);
}
}
该应用 运行 于:
- Tomcat 8.0.35
- JSF (mojarra) 2.2.13
编辑
- 在 Firefox 上,错误是:partialResponse 未定义
- 在 Chrome 上是:无法读取 属性 getAttribute of undefined
问题是由于重写(在 PrettyFaces 之前)。要解决此问题,您需要在 META-INF 内的 context.xml
文件中添加属性 allowCasualMultipartParsing="true"
。示例:
<Context path="/MyApp" allowCasualMultipartParsing="true">
<Resource auth="Container"
factory="org.jboss.weld.resources.ManagerObjectFactory"
name="BeanManager"
type="javax.enterprise.inject.spi.BeanManager"/>
</Context>
应用程序需要导入 excel 个文件 (.xlsx) 来填充一个数据库 table。当我尝试通过 AJAX 上传文件时出现问题。永远不会调用验证器(也永远不会调用侦听器)。当我尝试上传文件时,JSF AJAX JavaScript 文件抛出错误并显示在浏览器的控制台中:TypeError: partialResponse is not defined
.
我的第一个想法是这是一个错误,但我不确定。这是我的第一个 JSF 项目。
<h:form id="travels-form" class="toolbar ui form" enctype="multipart/form-data">
<div class="five wide field">
<input type="text" id="search" placeholder="Buscar..." />
</div>
<div class="actions">
<div class="inline field wide">
<h:selectOneMenu valueChangeListener="#{travelBean.filter}" >
<f:selectItem itemValue="" itemLabel="Todas las placas" />
<f:selectItems value="#{travelBean.licensePlates}" var="plate"
itemValue="${plate}" itemLabel="${plate}" />
<f:ajax execute="@this" render=":tblTravels" />
</h:selectOneMenu>
</div>
<h:outputLabel for="excel" value="Excel" styleClass="ui positive button" />
<h:inputFile id="excel" value="#{excelImporterBean.workbook}"
validator="#{excelImporterBean.validate}"
style="display: none">
<f:ajax execute="@this" render="excelMessage :tblTravels"
listener="#{excelImporterBean.onLoadWorkbook}"/>
</h:inputFile>
<h:message id="excelMessage" for="excel" errorClass="error-message"/>
<h:outputLink value="#{request.contextPath}/home/recorridos/nuevo"
styleClass="ui primary button">
Registrar
</h:outputLink>
</div>
</h:form>
这是 ExcelImporterBean 方法(验证器和侦听器):
public void onLoadWorkbook(AjaxBehaviourEvent ev) {
excelImporter.importWorkbook(workbook);
}
public void validate(FacesContext ctx, UIComponent comp, Object value) {
FacesMessage message = null;
Part _workbook = (Part) value;
if(((Part) value).getContentType().equals(EXCEL_TYPE)) {
message = new FacesMessage("Solo archivos excel 2007+ (.xlsx)");
}
if(message != null) {
throw new ValidatorException(message);
}
}
该应用 运行 于:
- Tomcat 8.0.35
- JSF (mojarra) 2.2.13
编辑
- 在 Firefox 上,错误是:partialResponse 未定义
- 在 Chrome 上是:无法读取 属性 getAttribute of undefined
问题是由于重写(在 PrettyFaces 之前)。要解决此问题,您需要在 META-INF 内的 context.xml
文件中添加属性 allowCasualMultipartParsing="true"
。示例:
<Context path="/MyApp" allowCasualMultipartParsing="true">
<Resource auth="Container"
factory="org.jboss.weld.resources.ManagerObjectFactory"
name="BeanManager"
type="javax.enterprise.inject.spi.BeanManager"/>
</Context>