我已经使用Spring 3.1开发了一个Web应用程序
在模块之一中,我需要保存一个具有许多OperationParameter对象的Operation对象。因此,在视图中,我提供了添加按钮,供用户为特定操作创建OperationParameters。
这两个模型都具有hibernate映射,并且Operation和OperationParameter之间存在一对多的关系。在Operation模型中,我有一个OperationParameters列表,当用户使用动态添加的OperationParameters创建新的Operation时,该列表将插入数据库中。
当我不使用验证时,它可以正常工作。当我为Operation模型插入操作时,OperationParameters的列表也将插入到OperationParameter表中。
我的问题是,如何对OperationParameter字段进行服务器端验证?如果验证完成后出现错误,那么如何显示特定OperationParameter字段的错误?
Operation.java
package com.abcprocure.servicerepo.model; // Generated Feb 9, 2012 11:30:06 AM by Hibernate Tools 3.2.1.GA import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import org.apache.commons.collections.FactoryUtils; import org.apache.commons.collections.list.LazyList; @Entity @Table(name="Operations" ,schema="dbo" ) public class Operations implements java.io.Serializable { private int operationId; @Embedded private Services services; private String operationName; private String isHqlsql; private String isMultipleTables; private String listOfTablesAffected; private String hqlQuery; private String typeOfOperation; private String operationDetail; private String inputVariables; private String outputparamdatatype; private String isCountQuery; private String isDynamicWhereQry; private String isPaginationRequired; private String biInputParameters; private List<OperationParameters> operationParameterses = LazyList .decorate(new ArrayList<OperationParameters>(), FactoryUtils.instantiateFactory(OperationParameters.class)); public Operations() { } public Operations(int operationId, Services services, String operationName) { this.operationId = operationId; this.services = services; this.operationName = operationName; } public Operations(int operationId, Services services, String operationName, String isHqlsql, String isMultipleTables, String listOfTablesAffected, String hqlQuery, String typeOfOperation, String operationDetail, String inputVariables, String outputparamdatatype, String isCountQuery, List operationParameterses) { this.operationId = operationId; this.services = services; this.operationName = operationName; this.isHqlsql = isHqlsql; this.isMultipleTables = isMultipleTables; this.listOfTablesAffected = listOfTablesAffected; this.hqlQuery = hqlQuery; this.typeOfOperation = typeOfOperation; this.operationDetail = operationDetail; this.inputVariables = inputVariables; this.outputparamdatatype = outputparamdatatype; this.isCountQuery = isCountQuery; this.operationParameterses = operationParameterses; } @Id @GeneratedValue @Column(name="operationId", unique=true, nullable=false) public int getOperationId() { return this.operationId; } public void setOperationId(int operationId) { this.operationId = operationId; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="serviceId", nullable=false) public Services getServices() { return this.services; } public void setServices(Services services) { this.services = services; } @Column(name="operationName", nullable=false, length=250) public String getOperationName() { return this.operationName; } public void setOperationName(String operationName) { this.operationName = operationName; } @Column(name="isHQLSQL", length=50) public String getIsHqlsql() { return this.isHqlsql; } public void setIsHqlsql(String isHqlsql) { this.isHqlsql = isHqlsql; } @Column(name="isMultipleTables", length=50) public String getIsMultipleTables() { return this.isMultipleTables; } public void setIsMultipleTables(String isMultipleTables) { this.isMultipleTables = isMultipleTables; } @Column(name="listOfTablesAffected", length=500) public String getListOfTablesAffected() { return this.listOfTablesAffected; } public void setListOfTablesAffected(String listOfTablesAffected) { this.listOfTablesAffected = listOfTablesAffected; } @Column(name="hqlQuery") public String getHqlQuery() { return this.hqlQuery; } public void setHqlQuery(String hqlQuery) { this.hqlQuery = hqlQuery; } @Column(name="typeOfOperation", length=50) public String getTypeOfOperation() { return this.typeOfOperation; } public void setTypeOfOperation(String typeOfOperation) { this.typeOfOperation = typeOfOperation; } @Column(name="operationDetail") public String getOperationDetail() { return this.operationDetail; } public void setOperationDetail(String operationDetail) { this.operationDetail = operationDetail; } @Column(name="inputVariables", length=5000) public String getInputVariables() { return this.inputVariables; } public void setInputVariables(String inputVariables) { this.inputVariables = inputVariables; } @Column(name="outputparamdatatype", length=50) public String getOutputparamdatatype() { return this.outputparamdatatype; } public void setOutputparamdatatype(String outputparamdatatype) { this.outputparamdatatype = outputparamdatatype; } @Column(name="isCountQuery", length=10) public String getIsCountQuery() { return this.isCountQuery; } public void setIsCountQuery(String isCountQuery) { this.isCountQuery = isCountQuery; } public String getIsDynamicWhereQry() { return isDynamicWhereQry; } public void setIsDynamicWhereQry(String isDynamicWhereQry) { this.isDynamicWhereQry = isDynamicWhereQry; } public String getIsPaginationRequired() { return isPaginationRequired; } public void setIsPaginationRequired(String isPaginationRequired) { this.isPaginationRequired = isPaginationRequired; } public String getBiInputParameters() { return biInputParameters; } public void setBiInputParameters(String biInputParameters) { this.biInputParameters = biInputParameters; } @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="operations") public List<OperationParameters> getOperationParameterses() { return this.operationParameterses; } public void setOperationParameterses(List<OperationParameters> operationParameterses) { this.operationParameterses = operationParameterses; } }
OperationParameters.java
package com.abcprocure.servicerepo.model; // Generated Feb 9, 2012 11:30:06 AM by Hibernate Tools 3.2.1.GA import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name="OperationParameters" ,schema="dbo" ) public class OperationParameters implements java.io.Serializable { private int parameterId; private Operations operations; private String inputOutputParamName; private String inputOutputParamType; private String inputOutputParamDataType; public OperationParameters() { } public OperationParameters(int parameterId, Operations operations, String inputOutputParamName, String inputOutputParamType, String inputOutputParamDataType) { this.parameterId = parameterId; this.operations = operations; this.inputOutputParamName = inputOutputParamName; this.inputOutputParamType = inputOutputParamType; this.inputOutputParamDataType = inputOutputParamDataType; } @Id @GeneratedValue @Column(name="parameterId", unique=true, nullable=false) public int getParameterId() { return this.parameterId; } public void setParameterId(int parameterId) { this.parameterId = parameterId; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="operationId", nullable=false) public Operations getOperations() { return this.operations; } public void setOperations(Operations operations) { this.operations = operations; } @Column(name="inputOutputParamName", nullable=false, length=250) public String getInputOutputParamName() { return this.inputOutputParamName; } public void setInputOutputParamName(String inputOutputParamName) { this.inputOutputParamName = inputOutputParamName; } @Column(name="inputOutputParamType", nullable=false, length=250) public String getInputOutputParamType() { return this.inputOutputParamType; } public void setInputOutputParamType(String inputOutputParamType) { this.inputOutputParamType = inputOutputParamType; } @Column(name="inputOutputParamDataType", nullable=false, length=250) public String getInputOutputParamDataType() { return this.inputOutputParamDataType; } public void setInputOutputParamDataType(String inputOutputParamDataType) { this.inputOutputParamDataType = inputOutputParamDataType; } }
服务于发布请求的Conroller方法添加新的Operation。
/** * Method that will serve the post request to add the operation and operation parameters submitted by the user. * @param operations * @param map * @return {@link String} The view name that will redirect to the get request to display the previous page with newly entered operation in the list. */ @RequestMapping(value="/add", method=RequestMethod.POST) public String addOperations(@ModelAttribute Operations operations, ModelMap map) { operations.getOperationParameterses().removeAll(Collections.singleton(null)); for(int i=0; i<operations.getOperationParameterses().size(); i++) { System.out.println("parameterName :: " + ((OperationParameters)operations.getOperationParameterses().get(i)).getInputOutputParamName()); if(((OperationParameters)operations.getOperationParameterses().get(i)).getInputOutputParamName() == null || "".equalsIgnoreCase((((OperationParameters)operations.getOperationParameterses().get(i))).getInputOutputParamName())) { operations.getOperationParameterses().remove(i); System.out.println("empty parameter removed...."); } } return "redirect:/operations/" + operations.getServices().getServiceId(); }
在这方面任何好的建议或榜样都会对我有很大的帮助。:)
**
我还想知道是否可以验证字段数组并将错误显示回jsp文件中?
请帮帮我。
经过一周的头脑风暴,我自己找到了解决方案。我很高兴终于实现了这一目标。:)
为了验证动态生成的字段,您需要依赖服务器端的自定义验证。因为如果我们对动态生成的字段使用基于注释的验证,那么验证后它将不会出现在控制器功能中。
因此,每当您执行自定义验证时,都会从控制器函数中调用验证。在这里,您可以在列表中动态生成的字段上生成错误。
如果验证不成功,则需要返回jsp页面并在表单上显示错误。您需要使用以下命令显示动态生成的字段值及其错误 ****。
我希望这对希望同样工作的其他人有所帮助。