2014-01-23 4 views
2

Я пытаюсь обновить данные из представления Spring MVC. Я мог обновлять данные, используя объект тестера, но не смог выполнить попытку обновления из представления Spring MVC. Запрос POST из представления не имеет проблемных ключей/значений, отправляемых на сервер. Он обновил мои данные таблицы, но с нулевым значением (если только для поля id).Spring MVC view & update

Просьба помочь и поблагодарить вас.

Моя таблица (tx_surveyrequest)

CREATE TABLE tx_surveyrequest 
(
id uuid NOT NULL, 
id_person uuid, 
id_surveyrequeststatus uuid, 
id_validationstatus uuid, 
id_employee_assistantgis uuid, 
formcode character varying(64), 
b_north character varying(32), 
b_east character varying(32), 
b_south character varying(32), 
b_west character varying(32), 
hectarage numeric(10,2), 
is_priority boolean DEFAULT false, 
requestdate date, 
surveyplandate date, 
surveyplantime time without time zone, 
requestedby character varying(32), 
requestedprice numeric(14,2), 
CONSTRAINT pk_tx_surveyrequest PRIMARY KEY (id) 
) 

Мой домен объект (SurveyRequest)

@Entity 
@Table(name = "tx_surveyrequest") 
public class SurveyRequest implements Serializable { 

private UUID id; 
private Person person; 
private String formCode; 
private String borderNorth; 
private String borderEast; 
private String borderSouth; 
private String borderWest; 
private Double hectarage; 
private Boolean priority; 
private DateTime requestDate; 
private DateTime surveyPlanDate; 
private LocalTime surveyPlanTime; 
private String requestedBy; 
private Double requestedPrice; 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "id") 
@Type(type="pg-uuid") 
public UUID getId() { 
    return id; 
} 

public void setId(UUID id) { 
    this.id = id; 
} 

@Column(name = "hectarage") 
public Double getHectarage(){ 
    return hectarage; 
} 

public void setHectarage(Double hectarage){ 
    this.hectarage = hectarage; 
} 

@Column(name = "formcode") 
public String getFormCode() { 
    return formCode; 
} 

public void setFormCode(String formCode) { 
    this.formCode = formCode; 
} 

@Column(name="is_priority") 
public Boolean getPriority() { 
    return priority; 
} 

public void setPriority(Boolean priority) { 
    this.priority = priority; 
} 

@Column(name="b_north") 
public String getBorderNorth() { 
    return borderNorth; 
} 

public void setBorderNorth(String border) { 
    this.borderNorth = border; 
} 

@Column(name="b_east") 
public String getBorderEast() { 
    return borderEast; 
} 

public void setBorderEast(String border) { 
    this.borderEast = border; 
} 

@Column(name="b_south") 
public String getBorderSouth() { 
    return borderSouth; 
} 

public void setBorderSouth(String border) { 
    this.borderSouth = border; 
} 

@Column(name="b_west") 
public String getBorderWest() { 
    return borderWest; 
} 

public void setBorderWest(String border) { 
    this.borderWest = border; 
} 

// TODO replace pattern with i18n 
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
@Column(name = "requestdate") 
public DateTime getRequestDate() { 
    return requestDate; 
} 

public void setRequestDate(DateTime requestDate) { 
    this.requestDate = requestDate; 
} 

// TODO replace pattern with i18n 
@Type(type = "org.joda.time.contrib.hibernate.PersistentDateTime") 
@DateTimeFormat(pattern = "dd/MM/yyyy") 
@Column(name = "surveyplandate") 
public DateTime getSurveyPlanDate() { 
    return surveyPlanDate; 
} 

public void setSurveyPlanDate(DateTime surveyPlanDate) { 
    this.surveyPlanDate = surveyPlanDate; 
} 

// TODO replace pattern with i18n 
@Type(type = "org.joda.time.contrib.hibernate.PersistentLocalTimeAsTime") 
@DateTimeFormat(pattern = "HH:mm") 
@Column(name = "surveyplantime") 
public LocalTime getSurveyPlanTime() { 
    return surveyPlanTime; 
} 

public void setSurveyPlanTime(LocalTime surveyPlanTime) { 
    this.surveyPlanTime = surveyPlanTime; 
} 

успех Обновление с помощью SurveyRequestUpdate

public class SurveyRequestUpdate { 

public static void main(String[] args) { 
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); 
    ctx.load("classpath:spring-data-app-context.xml"); 
    ctx.load("classpath:datasource.xml"); 
    ctx.refresh(); 

    SurveyRequestService surveyRequestService = ctx.getBean(
      "springJpaSurveyRequestService",SurveyRequestService.class); 

    UUID uid = UUID.fromString("0cd02976-1864-447b-b540-39d6e7ee3703");  
    SurveyRequest request = surveyRequestService.findById(uid); 
    System.out.println("Find by ID"); 
    System.out.println(request);   
    request.setSurveyPlanDate (new DateTime(2014,7,1,0,0)); 
    request.setSurveyPlanTime (new LocalTime(22,0)); 
    surveyRequestService.save(request); 
    System.out.println(request); 
} 

Form Update Просмотр

<jsp:directive.page contentType="text/html;charset=UTF-8" /> 
<jsp:output omit-xml-declaration="yes" /> 

<spring:message code="l_surveyrequest_list" var="labelSurveyRequestList" /> 
<spring:message code="l_surveyrequest_title" var="labelSurveyRequestTitle" /> 
<spring:message code="l_surveyrequest_code" var="labelSurveyRequestCode" /> 
<spring:message code="l_surveyrequest_requestdate" var="labelSurveyRequestRequestDate" /> 
<spring:message code="l_surveyrequest_surveydate" var="labelSurveyRequestSurveyDate" /> 
<spring:message code="l_surveyrequest_surveytime" var="labelSurveyRequestSurveyTime" /> 
<spring:message code="l_surveyrequest_priority" var="labelSurveyRequestPriority" /> 
<spring:message code="l_surveyrequest_complete" var="labelSurveyRequestComplete" /> 
<spring:message code="l_surveyrequest_hectarage" var="labelSurveyRequestHectarage" /> 
<spring:message code="l_surveyrequest_north" var="labelSurveyRequestNorth" /> 
<spring:message code="l_surveyrequest_east" var="labelSurveyRequestEast" /> 
<spring:message code="l_surveyrequest_south" var="labelSurveyRequestSouth" /> 
<spring:message code="l_surveyrequest_west" var="labelSurveyRequestWest" /> 

<spring:message code="form_new" var="formNew" /> 
<spring:message code="form_edit" var="formEdit" /> 

<spring:message code="btn_save" var="buttonSave" /> 
<spring:message code="btn_cancel" var="buttonCancel" /> 

<spring:message code="long_date_format_pattern" var="formatDate" /> 
<spring:message code="time_format_pattern" var="formatDateTime" /> 
<spring:message code="short_time_format_pattern" var="formatShortTime" /> 

<spring:url value="/surveyrequest" var="showSurveyRequestUrl" /> 

<spring:eval expression="surveyRequest.id == null ? formNew:formEdit" var="formTitle"/> 

<div class="row"> 
    <div class="col-md-12"> 
     <h1>${formTitle} ${labelSurveyRequestTitle}</h1> 
    </div> 
</div> 


<!-- /top action bar --> 
<div class="row"> 
    <div class="col-md-12"> 
     <c:if test="${not empty surveyRequest}"> 
      <form:form class="form-horizontal" 
       modelAttribute="surveyRequest" commandName="surveyRequest" method="post" enctype="multipart/form-data"> 

       <div class="row"> 
        <div class="col-md-12"> 
         <button type="submit" class="btn btn-primary">${buttonSave}</button> 
         <button type="reset" class="btn btn-primary">${buttonCancel}</button>       
        </div> 
       </div> 

       <c:if test="${not empty message}"> 
        <div id="message" class="${message.type}">${message.message}</div> 
       </c:if> 

       <div class="form-group">   
        <label class="col-md-3 control-label">${labelSurveyRequestCode}</label> 
        <div class="col-md-3"> 
         <form:input type="text" class="form-control" path="formCode" /> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label class="col-md-3 control-label">${labelSurveyRequestRequestDate}</label> 
        <div class='col-md-3 input-group date datepicker'> 
         <form:input type='text' class="form-control" path="requestDate" /> 
         <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span> 
         </span> 
        </div> 
       </div> 

       <div class="form-group"> 
        <label class="col-md-3 control-label">${labelSurveyRequestSurveyDate}</label> 
        <div class='col-md-3 input-group date datepicker'> 
         <form:input type='text' class="form-control" path="surveyPlanDate" /> 
         <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span> 
         </span> 
        </div> 
       </div>  

       <div class="form-group"> 
        <form:label class="col-md-3 control-label" 
         path="surveyPlanTime">${labelSurveyRequestSurveyTime}</form:label> 
        <div class='col-md-3 input-group date timepicker'> 
         <form:input type='text' class="form-control" path="surveyPlanTime" /> 
         <span class="input-group-addon"><span class="glyphicon glyphicon-time"></span> 
         </span>       
        </div> 
       </div>     
       <div class="form-group">   
        <label class="col-md-3 control-label">${labelSurveyRequestHectarage}</label> 
        <div class="col-md-3"> 
         <form:input type="text" class="form-control" path="hectarage" /> 
        </div> 
       </div>      
       <div class="form-group"> 
        <p class="col-md-3"></p> 
        <div class="col-md-9"> 
         <c:choose> 
          <c:when test="${surveyRequest.priority == true}"> 
           ${labelSurveyRequestPriority} 
          </c:when> 
         </c:choose>  
        </div> 
       </div> 
       <div class="form-group"> 
        <p class="col-md-3"></p> 
        <div class="col-md-9"> 
         <table class="table"> 
          <thead> 
           <tr> 
            <th>${labelSurveyRequestNorth}</th> 
            <th>${labelSurveyRequestEast}</th> 
            <th>${labelSurveyRequestSouth}</th> 
            <th>${labelSurveyRequestWest}</th> 
           </tr> 
          </thead> 
          <tbody> 
           <tr> 
            <td>${surveyRequest.borderNorth}</td> 
            <td>${surveyRequest.borderEast}</td> 
            <td>${surveyRequest.borderSouth}</td> 
            <td>${surveyRequest.borderWest}</td> 
           </tr> 
          </tbody> 
         </table>   
        </div> 
       </div> 

      </form:form> 
     </c:if> 
    </div> 
</div> 

<script type="text/javascript"> 
    $(function() {   
     $('.datepicker').datetimepicker({ 
      pickTime: false, 
      language: 'id',    
     }); 
     $('.timepicker').datetimepicker({ 
      pickDate: false, 
      minuteStepping:15, 
      useSeconds: false, 
      language: 'id' 
     }); 
    }); 
</script> 
</div> 

Мой контроллер

@RequestMapping("/surveyrequest") 
@Controller 
public class SurveyRequestController { 
private static final int PAGE_SIZE = 10; 

private static final Logger logger = LoggerFactory 
     .getLogger(SurveyRequestController.class); 

@Autowired 
MessageSource messageSource; 

@Autowired 
private SurveyRequestService surveyRequestService; 

// Others code omitted 

@RequestMapping(value="/{id}", method = RequestMethod.GET) 
public String show(@PathVariable("id") UUID id, Model model) { 
    SurveyRequest request = surveyRequestService.findById(id); 
    model.addAttribute("surveyRequest", request); 
    return "surveyrequest/show"; 
} 

/* 
* Edit a survey request 
*/ 
@RequestMapping(value="/{id}", params="form", method = RequestMethod.GET) 
public String updateForm(@PathVariable("id") UUID id, Model model) { 
    SurveyRequest request = surveyRequestService.findById(id); 
    model.addAttribute("surveyRequest", request); 
    return "surveyrequest/edit"; 
} 
/* 
* Update a survey request 
*/ 
@RequestMapping(value = "/{id}", params = "form", method = RequestMethod.POST) 
public String update(SurveyRequest surveyRequest, BindingResult bindingResult, Model uiModel, 
     HttpServletRequest httpServletRequest, RedirectAttributes redirectAttributes, Locale locale) { 

    if (bindingResult.hasErrors()) { 
     uiModel.addAttribute("message", new Message("error", messageSource.getMessage("surveyrequest_save_fail", new Object[]{}, locale)));   
     uiModel.addAttribute("surveyRequest", surveyRequest); 
     return "surveyrequest/update"; 
    } 
    uiModel.asMap().clear(); 
    redirectAttributes.addFlashAttribute("message", new Message("success", messageSource.getMessage("surveyrequest_save_success", new Object[]{}, locale)));   
    logger.info("Before paste: " + surveyRequest); 
    surveyRequestService.save(surveyRequest); 

    return "redirect:/surveyrequest/" + UrlUtil.encodeUrlPathSegment(surveyRequest.getId().toString(), httpServletRequest); 
} 

Обновлено: Я мог бы решить проблему с удалением ENCTYPE = "многослойную/форм-данных" в edit.jspx. Но это подняло еще одну проблему, как, если я собираюсь загрузить файл?

+0

Для загрузки файла вам понадобится 'CommonsMultipartResolver' в контексте вашего приложения плюс некоторые поддерживающие банки, чтобы Spring связывала параметры запроса. Без этого Spring не поймет, как привязать данные формы к модели (вы увидите нулевые значения). [Эта статья] (http://www.mkyong.com/spring-mvc/spring-mvc-file-upload-example/) проходит через то, что вам нужно. –

ответ

0

Добавить @ModelAttribute аннотацию к параметру объекта модели в методе контроллера, который вы вызываете, так что Spring знает, что это объект, к которому вы хотите привязать данные формы.

/* 
* Update a survey request 
*/ 
@RequestMapping(value = "/{id}", params = "form", method = RequestMethod.POST) 
public String update(@ModelAttribute("surveyRequest") SurveyRequest surveyRequest, 
        BindingResult bindingResult, Model uiModel, 
        HttpServletRequest httpServletRequest, 
        RedirectAttributes redirectAttributes, Locale locale) { 
    [...] 
} 
+0

Нет результата, добавив @ModelAttribute. Я думаю, что Spring уже связывает данные формы с объектом. Поскольку моя база данных была обновлена ​​(но с нулевым значением). – csutanto