所以我在一個Spring MVC項目中工作,在這個項目中我有一個帶有幾個Date字段的類,我正在爲它創建一個CRUD。問題是,我從數據庫中讀取了一個類的實例,然後將它發送到視圖進行編輯,儘管我沒有操作任何Date字段,但只有字符串,當我使用帖子表單收集對象時,日期字段即使它們來自數據庫的值爲空,但我將它們發送到具有該值的視圖。日期字段從視圖爲空,根本不處理它們
類:
package com.sophos.mat.beans;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.validator.constraints.Length;
@Entity
@Table(name="T_PROYECTOS")
public class Proyecto implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@Column(name="IN_PROYECTO")
@GeneratedValue(strategy=GenerationType.AUTO, generator="SECUENCIA_IN_PROYECTO")
@SequenceGenerator(name="SECUENCIA_IN_PROYECTO", sequenceName="SECUENCIA_IN_PROYECTO", allocationSize=1, initialValue= 1)
private long id;
@Column(name="VC_NOMBRE")
@Length(max = 50, message = "El campo no puede exceder los 50 caracteres")
private String nombre;
@Column(name="VC_DESCRIPCION")
@Length(max = 200, message = "El campo no puede exceder los 200 caracteres")
private String descripcion;
@Column(name="VC_CODIGO_SOPHOS")
@Length(max = 20, message = "El campo no puede exceder los 20 caracteres")
private String codigoSophos;
@Column(name="DT_FECHACREACION")
private Date fechaCreacion;
@Column(name="VC_USUARIOACTUALIZACION")
private String usuarioActualizacion;
@Column(name="DT_FECHAACTUALIZACION")
private Date fechaActualizacion;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public String getCodigoSophos() {
return codigoSophos;
}
public void setCodigoSophos(String codigoSophos) {
this.codigoSophos = codigoSophos;
}
public Date getFechaCreacion() {
return fechaCreacion;
}
public void setFechaCreacion(Date fechaCreacion) {
this.fechaCreacion = fechaCreacion;
}
public String getUsuarioActualizacion() {
return usuarioActualizacion;
}
public void setUsuarioActualizacion(String usuarioActualizacion) {
this.usuarioActualizacion = usuarioActualizacion;
}
public Date getFechaActualizacion() {
return fechaActualizacion;
}
public void setFechaActualizacion(Date fechaActualizacion) {
this.fechaActualizacion = fechaActualizacion;
}
}
控制器:
package com.sophos.mat.controller;
import java.util.Date;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.sophos.mat.beans.Proyecto;
import com.sophos.mat.services.IProyectoService;
@Controller
public class ProyectoController {
@Autowired
private IProyectoService proyectoService;
@RequestMapping(value = "/editarproyecto/{id}", method = RequestMethod.GET)
public String editarProyectoGet(ModelMap model, @PathVariable long id){
try {
Proyecto proyectoData = proyectoService.buscarProyectoPorId(id);
model.put("proyectoData", proyectoData);
return "editarproyecto";
} catch (Exception e) {
e.printStackTrace();
return "redirect:/proyectos";
}
}
@RequestMapping(value="/editarproyecto/{id}", method = RequestMethod.POST)
public String editarProyectoPost(ModelMap model, @PathVariable long id, @ModelAttribute("proyectoData")@Valid Proyecto proyectoData, BindingResult result){
if(result.hasErrors()){
return "editarproyecto";
}
try{
proyectoData.setFechaActualizacion(new Date());
proyectoService.actualizarProyecto(proyectoData);
return "redirect:/proyectos";
}catch(Exception e){
e.printStackTrace();
return "redirect:/proyectos";
}
}
public IProyectoService getProyectoService() {
return proyectoService;
}
public void setProyectoService(IProyectoService proyectoService) {
this.proyectoService = proyectoService;
}
}
和視圖:editarproyecto.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib uri= "http://www.springframework.org/tags/form" prefix="form" %>
<html>
<head>
<title>>Nuevo Proyecto</title>
<style>
.error { color: red; }
</style>
</head>
<body>
<h1>Nuevo Proyecto</h1>
<form:form method="post" modelAttribute="proyectoData">
<table >
<tr>
<td align="right">
Nombre proyecto:
</td>
<td>
<form:input path="nombre"/>
</td>
<td>
<form:errors path="nombre" cssClass="error"/>
</td>
</tr>
<tr>
<td align="right">
Descripción
</td>
<td>
<form:input path="descripcion"/>
</td>
<td>
<form:errors path="descripcion" cssClass="error"/>
</td>
</tr>
<tr>
<td align="right">
Cód. Sophos
</td>
<td>
<form:input path="codigoSophos"/>
</td>
<td>
<form:errors path="codigoSophos" cssClass="error"/>
</td>
</tr>
<tr>
<td align="right">
Usuario que actualiza
</td>
<td>
<form:input path="usuarioActualizacion"/>
</td>
<td>
<form:errors path="usuarioActualizacion" cssClass="error"/>
</td>
</tr>
</table>
<br>
<input type="submit" value="Guardar">
</form:form>
<a href="<c:url value="proyectos"/>">Proyectos</a>
</body>
</html>
當後期處理,我得到從休眠狀態的異常告訴我我試圖更新爲NULL對應於類字段'fechaCreac'的'DT_FECHACREACION'列離子'。作爲一個臨時修復,我必須在POST方法中添加一個查詢,以將「fechaCreacion」重置爲其先前的值,我不想更改該值,然後使用其餘捕獲值更新實體。這有效,但是很醜陋,增加了額外和不必要的開銷。我的數據庫是Oracle 11g。在此先感謝人們!
PD:非常新手春季開發人員,我在實習期間,在實習結束時盡我所能得到一份完整的合同:D所以任何幫助都將非常感激。
它會阻止我能夠在未來的視圖中顯示該日期嗎?另外,我應該添加到我的POM能夠使用註釋?我似乎無法在mave repo中找到jar。 –
在這裏,你有這一切的信息https://github.com/FasterXML/jackson-annotations – jonhid