我一直在尝试解决这个问题很多时间,但我看不出我的配置有什么问题。
我要做的是创建一个新的“元数据”对象。该对象具有以下域类:
package domain;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.hibernate.validator.constraints.NotBlank;
@Entity
@Access(AccessType.PROPERTY)
public class Metadata extends DomainEntity{
private String name;
//Relationship
private Collection<Question> questions;
public Metadata() {
super();
questions = new ArrayList<Question>();
}
@Valid
@NotBlank
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Valid
@NotNull
@ManyToMany(mappedBy = "metadata")
public Collection<Question> getQuestions() {
return questions;
}
public void setQuestions(Collection<Question> questions) {
this.questions = questions;
}
}
所以我有一个按钮转到创建页面,其中输入属性为“name”的空(其余属性为空或由spring自动生成)。创建视图如下:
<%@page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib prefix="jstl" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@taglib prefix="security"
uri="http://www.springframework.org/security/tags"%>
<%@taglib prefix="display" uri="http://displaytag.sf.net"%>
<%@ taglib prefix="acme" tagdir="/WEB-INF/tags"%>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="well well-sm">
<form:form class="form-horizontal" method="POST"
action="metadata/edit.do" modelAttribute="metadata"
enctype="multipart/form-data">
<form:hidden path="id" />
<form:hidden path="version" />
<form:hidden path="questions" />
<fieldset>
<!-- Name -->
<div class="form-group">
<form:label path="name" class="col-md-3 control-label" for="name">
<spring:message code="metadata.name" />
</form:label>
<div class="col-md-6">
<form:input path="name" id="name" name="name" type="text"
class="form-control" />
</div>
<form:errors path="name" cssClass="error" />
</div>
<!-- Form actions -->
<div class="form-group">
<div class="col-md-12 text-center">
<input type="submit" name="save" class="btn btn-primary btn-lg"
value="<spring:message code="metadata.save" />" />
<%-- <jstl:if test="${!create}"> --%>
<!-- <a class="btn btn-primary btn-lg" data-toggle="modal" -->
<%-- data-target="#basicModal"><spring:message --%>
<%-- code="metadata.delete" /></a> --%>
<!-- <div class="modal fade" id="basicModal" tabindex="-1" -->
<!-- role="dialog" aria-labelledby="basicModal" aria-hidden="true"> -->
<!-- <div class="modal-dialog"> -->
<!-- <div class="modal-content"> -->
<!-- <div class="modal-header"> -->
<!-- <button type="button" class="close" data-dismiss="modal" -->
<!-- aria-hidden="true">×</button> -->
<!-- <h4 class="modal-title" id="myModalLabel"> -->
<%-- <spring:message code="metadata.confirm.title" /> --%>
<!-- </h4> -->
<!-- </div> -->
<!-- <div class="modal-body"> -->
<!-- <h3> -->
<%-- <spring:message code="metadata.confirm.body" /> --%>
<!-- </h3> -->
<!-- </div> -->
<!-- <div class="modal-footer"> -->
<!-- <button type="submit" name="delete" class="btn btn-default" -->
<!-- onclick="history.back()"> -->
<%-- <spring:message code="metadata.confirm.yes" /> --%>
<!-- </button> -->
<!-- <button type="button" class="btn btn-primary" -->
<!-- data-dismiss="modal"> -->
<%-- <spring:message code="metadata.confirm.no" /> --%>
<!-- </button> -->
<!-- </div> -->
<!-- </div> -->
<!-- </div> -->
<!-- </div> -->
<%-- </jstl:if> --%>
<a href="metadata/list.do"><input type="button"
class="btn btn-primary btn-lg"
value="<spring:message code="metadata.cancel"/>" id="cancelar"
name="cancelar"
onclick="self.location.href = metadata/list.do" /></a>
</div>
</div>
</fieldset>
</form:form>
</div>
</div>
</div>
</div>
最后,由于BindingProvider而失败的我的控制器类有错误,因为Metadata对象的属性“name”不能为null:
package controllers;
import java.util.ArrayList;
import java.util.Collection;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import services.MetadataService;
import domain.Metadata;
import domain.Question;
@Controller
@RequestMapping("/metadata")
public class MetadataController {
// Services ----------------------------------------------------------------
@Autowired
private MetadataService metadataService;
// Constructor
// ---------------------------------------------------------------
public MetadataController() {
super();
}
// Listing
// -------------------------------------------------------------------
@RequestMapping("/list")
public ModelAndView list() {
ModelAndView result;
String uri = "metadata/list";
String requestURI = "metadata/list.do";
Collection<Metadata> metadatas = metadataService.findAll();
result = createListModelAndView(requestURI, metadatas, uri);
return result;
}
// Creation
// ------------------------------------------------------------------
@RequestMapping(value = "/create", method = RequestMethod.GET)
public ModelAndView create() {
ModelAndView result;
Metadata metadata = metadataService.create();
result = createCreateModelAndView(metadata);
return result;
}
// Edition
// -------------------------------------------------------------------
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public ModelAndView edit(@RequestParam int metadataId) {
ModelAndView result;
Metadata metadata = metadataService.findOne(metadataId);
result = createEditModelAndView(metadata);
return result;
}
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public ModelAndView save(@Valid Metadata metadata, BindingResult binding,
RedirectAttributes redirect) {
ModelAndView result;
if (binding.hasErrors()) {
if (metadata.getId() == 0) {
result = createEditModelAndView(metadata, "metadata.commit.error");
} else {
result = createCreateModelAndView(metadata, "metadata.commit.error");
}
} else {
try {
metadataService.save(metadata);
result = new ModelAndView("redirect:list.do");
} catch (Throwable oops) {
if (metadata.getId() == 0) {
result = createEditModelAndView(metadata, "metadata.commit.error");
} else {
result = createCreateModelAndView(metadata, "metadata.commit.error");
}
}
}
return result;
}
// @RequestMapping(value = "/edit", method = RequestMethod.POST, params = "delete")
// public ModelAndView delete(@ModelAttribute Metadata metadata,
// BindingResult bindingResult, RedirectAttributes redirect) {
// ModelAndView result;
//
// try {
// redirect.addFlashAttribute("successMessage", "metadata.deleteSuccess");
// metadataService.delete(metadata);
// result = new ModelAndView("redirect:list.do");
// } catch (Throwable oops) {
// if (oops.getMessage() == "Error") {
// result = createEditModelAndView(metadata, "metadata.error");
// } else {
// result = createEditModelAndView(metadata, "metadata.commit.error");
// }
// }
// return result;
// }
// Other bussiness method
protected ModelAndView createEditModelAndView(Metadata metadata) {
assert metadata != null;
ModelAndView result;
result = createEditModelAndView(metadata, null);
return result;
}
protected ModelAndView createCreateModelAndView(Metadata metadata) {
assert metadata != null;
ModelAndView result;
result = createCreateModelAndView(metadata, null);
return result;
}
protected ModelAndView createEditModelAndView(Metadata metadata,
String message) {
assert metadata != null;
Collection<Question> questions = new ArrayList<Question>();
ModelAndView result;
result = new ModelAndView("metadata/edit");
result.addObject("questions", questions);
result.addObject("metadata", metadata);
return result;
}
protected ModelAndView createCreateModelAndView(Metadata metadata,
String message) {
assert metadata != null;
Collection<Question> questions = new ArrayList<Question>();
ModelAndView result;
result = new ModelAndView("metadata/create");
result.addObject("questions", questions);
result.addObject("create", true);
result.addObject("metadata", metadata);
return result;
}
protected ModelAndView createListModelAndView(String requestURI,
Collection<Metadata> metadatas, String uri) {
ModelAndView result;
result = new ModelAndView(uri);
result.addObject("metadatas", metadatas);
result.addObject("requestURI", requestURI);
return result;
}
}
看了几天之后,我无法通过提交按钮将我想要的值发送给控制器,我不知道该怎么做。没有日志错误。它只返回创建页面,说“name”不能为null。
答案 0 :(得分:0)
public ModelAndView save(@Valid Metadata metadata
我认为你在abovve行中缺少@ModelAttribute annotation
。你可以用它作为一个
当您想要绑定请求中的数据并将其隐式添加到模型时,参数。
所以将保存方法更改为
public ModelAndView save(@ModelAttribute("metadata") @Valid Metadata metadata
如果您可以发布结果,这应该可以工作和欣赏。
答案 1 :(得分:0)
问题是我在使用enctype=multipart...
时没有发送任何二进制数据。
这似乎在Spring
中产生了一些冲突。删除enctype
并让Spring
使用默认设置可以解决问题。