2017-01-23 26 views
0

所以我在一個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所以任何幫助都將非常感激。

回答

0

當您調用服務時,您必須控制返回到視圖的哪些字段。

Proyecto proyectoData = proyectoService.buscarProyectoPorId(id); 

你可以省略你的DAO用@JsonIgnore註解返回的字段。

.... 
import com.fasterxml.jackson.annotation.JsonIgnore; 


@Entity 
@Table(name="T_PROYECTOS") 
public class Proyecto implements Serializable{ 
    ... 

    @JsonIgnore 
    public Date getFechaCreacion() { 
     return fechaCreacion; 
    } 

    .... 
} 
+0

它會阻止我能夠在未來的視圖中顯示該日期嗎?另外,我應該添加到我的POM能夠使用註釋?我似乎無法在mave repo中找到jar。 –

+0

在這裏,你有這一切的信息https://github.com/FasterXML/jackson-annotations – jonhid

相關問題