首先说发生的问题:
https://blog.csdn.net/qq_27617675/article/details/82852113
因为测试用例是之前的代码,在自定义转换器的时候
<!-- 给容器注入类型转换服务工厂Bean 在属性中添加自定义的转换器 -->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="testConver"/>
</set>
</property>
</bean>
这个转换服务工厂Bean的类型用ConversionServiceFactoryBean会导致自定义的转换器和原生的 @DateTimeFormat注解背后的转换器有冲突,所以Class类型换成org.springframework.format.support.FormattingConversionServiceFactoryBean
即可解决问题,既可以使用自定义的转换器也可以使用自带的。
数据格式化----测试@NumberFormat和@DateTimeFormat注解
测试bean
package top.demo.crud.bean;
import java.util.Date;
import org.hibernate.validator.constraints.Email;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
public class TestData {
@NumberFormat(pattern="###,###.###")
public float salary;
@DateTimeFormat(pattern="yyyy-MM-dd")
public Date birthday;
@Override
public String toString() {
return "TestData [salary=" + salary + ", birthday=" + birthday + ", email=" + email + ", num=" + num
+ ", description=" + description + "]";
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String email;
public int num;
public String description;
public TestData()
{
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
测试用到的jsp页面
其中form:errors标签在转换失败时会显示错误信息
<%@page import="top.demo.crud.bean.TestData"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form:form action="testdata" method="POST" modelAttribute="testData">
Salary:<form:input path="salary"/><form:errors path="salary"></form:errors>
<br>
Birthday:<form:input path="birthday"/><form:errors path="birthday"></form:errors> <br>
Email:<form:input path="email"/><form:errors path="email"></form:errors> <br>
<input type="submit"/>
</form:form>
</body>
</html>
控制器方法增加了两个
@RequestMapping("/testFormatPage")
public String TestFormat(Map<String, Object> map)
{
map.put("testData", new TestData());
return "testFormat";
}
@RequestMapping("/testdata")
public String TestDataControl(TestData testData,BindingResult bindingResult) {
System.out.println(testData);
if(bindingResult.getErrorCount()>0)
{
List<ObjectError> errors=bindingResult.getAllErrors();
for(ObjectError error:errors)
{
System.out.println(error.getObjectName()+":"+error.getDefaultMessage());
}
}
return "testFormat";
}
输入
结果
输入
结果
JSR303数据校验
首先导入hibernate-validator包 其实现了JSR303标准
把javax-el的包放在tomcat lib下
有辣么多注解可用
在Bean上增加注解
@Email
public String email;
@NotNull
public String description;
在jsp页面增加相应input
且在控制器方法上增加注解@Valid
@RequestMapping("/testdata")
public String TestDataControl(@Valid TestData testData,BindingResult bindingResult) {
System.out.println(testData);
if(bindingResult.getErrorCount()>0)
{
List<ObjectError> errors=bindingResult.getAllErrors();
for(ObjectError error:errors)
{
System.out.println(error.getObjectName()+":"+error.getDefaultMessage());
}
}
return "testFormat";
}
输入和结果