目录
五、@JsonFormat 和 @DateTimeFormat 区别
一、@RequestBody
处理JSON的消息转换器 我自己也能配置吗?
是的,你完全可以在Spring Boot应用中自定义消息转换器。这个过程可以通过覆盖默认的HttpMessageConverters实现。以下是一个例子,展示了如何添加一个自定义的JSON消息转换器:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter(new ObjectMapper()));
}
}
在上面的代码中,我们创建了一个新的WebMvcConfigurer
,并重写了configureMessageConverters
方法。在该方法中,我们添加了一个新的MappingJackson2HttpMessageConverter
实例。
请注意,你可以传递一个自定义的ObjectMapper
给MappingJackson2HttpMessageConverter
的构造函数,以便自定义JSON的处理方式。例如,你可以配置ObjectMapper
以更改日期格式,忽略未知属性,等等。
同样,如果你想使用其他库(如Gson)处理JSON,你可以创建一个GsonHttpMessageConverter
,或者你自己定义的HttpMessageConverter
。
请注意,上述代码将添加一个新的消息转换器,而不是替换现有的消息转换器。如果你想替换所有默认的消息转换器,你应该重写extendMessageConverters
而不是configureMessageConverters
。
二、@Valid
在Spring框架中,@Valid
注解主要用于触发被注解对象的数据校验。
它通常用于Controller方法中,与@RequestBody
一起使用,用于在请求到达处理方法之前,验证请求体中的数据。如果数据校验失败,Spring将抛出一个MethodArgumentNotValidException
异常。
@Valid
注解与Java Bean Validation(JSR 303)标准一起使用,可以为JavaBean对象提供数据校验的功能。你可以在JavaBean对象的字段上使用一些内置的注解(如@NotNull
,@Size
,@Pattern
等)或自定义的注解进行数据校验。
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Person {
@NotNull
@Size(min = 2, max = 30)
private String name;
@NotNull
@Min(18)
private Integer age;
// getters and setters...
}
import javax.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PersonController {
@PostMapping("/person")
public Person createPerson(@Valid @RequestBody Person person) {
// ... do something with the person
return person;
}
}
三、@JsonFormat注解
- 提供者:jackson
- 作用:可以约束时间的接收格式和响应格式 (接收和响应的都是JSON字符串),将日期类型数据在JSON格式和java.util.Date对象之间转换。与传输方向没有关系(前端到后端or后端到前端都可以使用),注意因为我们是东八区(北京时间),使用时需要加上时区( timezone = “GMT+8”),不然所得值会比实际时间晚8小时;
- 常用注解属性:
-
名称 作用 pattern 约定时间格式:pattern=“yyyy-MM-dd HH:mm:ss” timezone 指定具体时区: timezone = “GMT+8” or timezone = “Asia/Shanghai” - 单独使用@JsonFormat注解时需要先通过@RequestBody将入参参数映射到实体后,@JsonFormat注解才能去对时间格式进行约束;
-
@Data public class DateEntity { @JsonFormat(pattern = "yyyy-MM-dd hh", timezone = "GMT+8") private Date date; }
四、@DateTimeFormat注解
- 提供者:Spring
- 作用:可对java.util.Date、java.uitl.calendar、java.long.Long及Joda时间类型的属性进行标注,主要处理前端时间类型与后端pojo对象中的成员变量进行数据绑定,所约束的时间格式并不会影响后端返回前端的时间类型数据格式;
- 注意(注意!注意!注意!讲三遍):前端入参数据的时间格式必须与注解中定义的时间格式相同,不然会报错,如:@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm”) 则入参的格式必须为"2020-6-4 10:43";
- 常用注解属性
- @JsonFormat 和 @DateTimeFormat 区别
名称 作用 iso 类型为DateTimeFormat.ISO,常用值:
DateTimeFormat.ISO.DATE:格式为yyyy-MM-dd
DateTimeFormat.ISO.DATE_TIME:格式为yyyy-MM-dd hh:mm:ss.SSSZ
DateTimeFormat.ISO.TIME:格式为hh:mm:ss.SSSZ
DateTimeFormat.ISO.NONE:表示不使用ISO格式的时间(默认值)pattern 类型为String,使用自定义时间格式化字符串,如"yyyy-MM-dd hh:mm:ss" style 类型为String,通过样式指定日期时间的格式,由两位字符组成,
第一位表示日期的样式,第二位表示时间的格式,以下是几个常用的可选值:
S:短日期/时间的样式
M:中日期/时间的样式
L:短日期/时间的样式
F:完整日期/时间的样子
-:忽略日期或时间的样式
默认值 style=“SS”
五、@JsonFormat 和 @DateTimeFormat 区别
@JsonFormat
既可以约束前端传入的时间类型参数格式,也可以约束后端响应前端的时间类型格式;@DateTimeFormat
:- 只能约束前端入参时间类型的格式,并不会修改原有的日期对象的格式,如果想要获得期望的日期格式,是需要自己手动转换的;
- 如果单独使用
@DateTimeFormat
时,响应给前端的时间会比实际时间晚8个小时(时区原因)。
六、@GeneratedValue 自动增长
@GeneratedValue
注解是用于指定生成主键的策略的,通常与@Id
注解一起使用。这个注解有一个名为strategy
的属性,它决定了主键生成的策略。以下是几种常用的生成策略:1. AUTO (默认)
当你不指定
strategy
时,或者明确地设置为GenerationType.AUTO
,JPA 自动选择最合适的策略,这取决于数据库方言。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
2. IDENTITY
使用数据库的自增字段。这意味着这个字段被数据库自动递增。这是 MySQL 和 SQL Server 等数据库中常用的类型。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
3. SEQUENCE
使用数据库的序列生成主键。这在 Oracle、PostgreSQL 等数据库中比较常用。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq") @SequenceGenerator(name = "my_seq", sequenceName = "MY_SEQUENCE")
private Long id;
4. TABLE
使用一个单独的数据库表来生成主键。
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "my_table") @TableGenerator(name = "my_table", table = "ID_GEN_TABLE", pkColumnName = "ID_NAME", valueColumnName = "ID_VAL")
private Long id;
每种策略都有其优缺点,以及特定数据库的限制。
额外属性
generator
: 当使用SEQUENCE
或TABLE
策略时,你可以指定一个生成器的名字。@SequenceGenerator
和@TableGenerator
: 这些注解可以用来更细致地定制生成策略。