在春天设置日期和时间mvc

时间:2017-06-29 08:01:53

标签: java mysql spring hibernate jsp

我使用最新的弹簧和休眠。我需要从jsp页面获取日期和时间,并希望插入到mysql数据库中。我使用 TIMESTAMP 作为一个字段的dataType。当我尝试保存时,没有错误,但显示" HTTP状态[400] - [错误请求] "。

最后我发现,日期和时间格式存在问题(可能是注释或mysql数据类型或jsp页面)。因为我尝试更新表单而不更改日期时间的valuei( path =" startDateTime" )。它已成功更新。当我尝试更改日期时间(路径=" startDateTime" )中的值时,它会显示" HTTP状态[400] - [错误请求] "

我需要将日期和时间更新为数据库。我尝试了很多,但失败了。请帮我解决这个问题。提前谢谢。

模型类

public class Survey{

//other declaration

    @Column(name="startDateTime",columnDefinition="TIMESTAMP")      
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(pattern="yyyy-MM-dd'T'HH:mm:ss")
    private Date startDateTime;
}

jsp page

<spring:url value="/survey/save" var="saveURL"></spring:url>
<form:form action="${saveURL}" method="POST" modelAttribute="surveyForm">
//other stuffs
<form:input type="datetime-local" path="startDateTime" />
</form:form>

控制器

public ModelAndView saveSurvey(@ModelAttribute("surveyForm") Survey survey) {       
    surveyService.saveOrUpdate(survey);
    return new ModelAndView("redirect:/survey/list");
}

4 个答案:

答案 0 :(得分:1)

为了采用良好的做法,我建议使用JAVA 8 LocalDateTime类。 所以像这样修改你的模型类

public class Survey{

//other declaration

    @Column(name="startDateTime",columnDefinition="TIMESTAMP")      
    private LocalDateTime startDateTime;
}

使用JAVA 8 LocalDateTime类时,您不再需要添加@Temporal(TemporalType.TIMESTAMP)

之后,您需要通过实现Converter接口创建一个LocalDateTimeConverter类,如此

import org.springframework.core.convert.converter.Converter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public final class LocalDateTimeConverter implements Converter<String, LocalDateTime> {

    private final DateTimeFormatter formatter;

    public LocalDateTimeConverter(String dateFormat) {
        this.formatter = DateTimeFormatter.ofPattern(dateFormat);
    }

    @Override
    public LocalDateTime convert(String source) {
        if (source == null || source.isEmpty()) {
            return null;
        }

        return LocalDateTime.parse(source, formatter);
    }
}

然后在配置类中注册LocalDateTimeConverter类,如下所示

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
class WebMvcContext extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new LocalDateTimeConverter("yyyy-MM-dd'T'HH:mm:ss.SSS"));
    }
}

这就是全部,我希望它能解决你的问题。 您可以了解更多here

好吧,我仍然建议您不要让责任让您的网站用户更新日期时间为什么不允许hibernate使用@CreationTimestamp@UpdateTimestamp为您执行此操作hibernate的注释,或者最好使用JPA @PrePersist@PreUpdate这样的注释

@Column(name="startDateTime")      
@PrePersist
private LocalDateTime startDateTime;

@Column(name="updatedDateTime")      
@PreUpdate
private LocalDateTime updatedDateTime;

使用这种方法,您不再需要在表单中添加startDateTime字段,因为hibernate会自动为您插入和更新这些列。

注意:所有浏览器都不支持表单输入类型datetime-local。

答案 1 :(得分:0)

问题是发送到spring的参数mvc是String,你的dateToday类型是date。 Spring mvc不知道如何转换它。

你需要一个@InitBinder 请参阅下面的

@InitBinder  
public void initBinder(WebDataBinder binder) {  
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    binder.registerCustomEditor(Timestamp.class, new CustomDateEditor(dateFormat, false));  
}  

答案 2 :(得分:0)

在你的hibernate配置文件.xml中,是否设置为更新?尝试检查它。

  

<property name="hbm2ddl.auto">update</property>

答案 3 :(得分:0)

在控制器类中使用initbinder

@InitBinder
public void dataBinding(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new 
        SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    dateFormat.setLenient(false);
    binder.registerCustomEditor(LocalDateTime.class, "startDateTime", new CustomDateEditor(dateFormat, true));
}

希望这能解决它