插入数据时出错 java.time.LocalDate 在 SpringBoot 中包含字段 dateOfBirth 类型 LocalDate
Posted
技术标签:
【中文标题】插入数据时出错 java.time.LocalDate 在 SpringBoot 中包含字段 dateOfBirth 类型 LocalDate【英文标题】:Error java.time.LocalDate when insert data includes field dateOfBirth type LocalDate in SpringBoot 【发布时间】:2021-12-16 19:32:38 【问题描述】:我需要支持以下错误:
当我使用 RESTFUL API 插入数据对象时,我收到了来自 Postman 的错误抛出消息:
这是用户实体类
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User extends BaseEntity
@Column(nullable = false, unique = true, columnDefinition = "varchar(50)")
private String userName;
@Column(nullable = false)
private String password;
@Column(unique = true, nullable = false)
private String email;
@Column(unique = true, nullable = false)
private String phone;
@Column
private String address;
@Column
private String fullName;
@Column
private LocalDate dateOfBirth;
@ManyToMany
@JoinTable(name = "permission",
joinColumns = @JoinColumn(name = "user_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "role_id", nullable = false))
@JsonIgnore
private Set<Role> roles = new HashSet<>();
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
@JsonIgnore
private List<Blog> blogs = new ArrayList<>();
这是 UserSaveRequest 类
@Getter
@Setter
public class UserSaveRequest
private long id;
private String userName;
private String password;
private String email;
private String phone;
private String address;
private String fullName;
private LocalDate dateOfBirth;
private List<Long> ids;
这是对对象实体的方法映射对象请求
public User mapToEntity(UserSaveRequest userSaveRequest)
UserValidate.validate(userSaveRequest);
String encode = PasswordHasher.hash(userSaveRequest.getPassword());
User user = new User();
BeanUtils.refine(userSaveRequest,user,BeanUtils::copyNonNull);
user.setPassword(encode);
List<Role> roles = roleRepository.findAllByIdIn(userSaveRequest.getIds());
user.setRoles(new HashSet<>(roles));
return user;
这是用户控制器类
@RestController // để đánh dấu là API
@RequestMapping("/api")
@Data
public class UserController extends BaseController
private final static Logger LOGGER = LoggerFactory.getLogger(UserController.class);
private final UserService userService;
private final UserMapper userMapper;
private final TokenProducer tokenProducer;
private JwtPayload createPayload(User user)
JwtPayload jwtPayload = new JwtPayload();
jwtPayload.setUserName(user.getUserName());
jwtPayload.setId(user.getId());
String roles = user.getRoles().stream().map(Role::getName).collect(Collectors.joining(","));
jwtPayload.setRole(roles);
return jwtPayload;
@PostMapping("/user")
@PreAuthorize("hashAnyRole('ADMIN') OR hashAnyRole('USER') OR hashAnyRole('MANAGER')")
public ResponseEntity<BaseResponse> save(@RequestBody UserSaveRequest userSaveRequest)
userService.save(userSaveRequest, userMapper::mapToEntity);
return success();
这是接口BaseService
public interface BaseService<T, ID>
<RQ> void save(RQ req, Function<RQ, T> transform);
这是抽象类 AbstractServiceImpl
@Data
public abstract class AbstractServiceImpl<T, ID> implements BaseService<T, ID>
protected final BaseRepository baseRepository;
public AbstractServiceImpl(BaseRepository baseRepository)
this.baseRepository = baseRepository;
@Override
public <RQ> void save(RQ req, Function<RQ, T> transform)
T t = transform.apply(req);
baseRepository.save(t);
这是 UserServiceImpl
@Service
public class UserServiceImpl extends AbstractServiceImpl<User, Long> implements UserService
public UserServiceImpl(UserRepository userRepository)
super(userRepository);
【问题讨论】:
您可能想查看您的 Jackson 版本(Spring Boot 的依赖项)是否已经支持 java.time API,或者您是否需要添加另一个包含LocalDate
等转换器的依赖项。
要么您缺少 Java8time 的杰克逊依赖项,要么您自己配置了 ObjectMapper
(防止自动配置)并且未注册 java8time 模块。
***.com/questions/45863678/…
【参考方案1】:
此异常是由于 jackson 无法正常工作,可能是因为它不在您的依赖项中1,或者您使用的版本与 LocalDate 对象不兼容。另一种可能是日期格式2
1* 将此代码添加到您的 pom.xml 中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
2* 您可以在 dateOfBirth 变量中添加格式注释:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
并确保您尊重您指定的模式
【讨论】:
你不需要那个依赖,因为它是从 Spring Boot 中包含 Web 启动器时默认添加的。可能需要为 Jackson 添加 jdk8 日期/时间支持(仅在使用旧版本的 Spring Boot 或 Jackson 时)。 我尝试测试它,但问题无法解决 这很奇怪!你修改格式了吗? yyyy-MM-dd 在你的情况下 @KASMIG。是的,我尝试修改格式,但无法解决问题。你能帮帮我吗? 我认为这与您的杰克逊软件包有关。你重建项目了吗?此外,还有另一种方法可以在没有杰克逊的情况下传递日期!你可以通过表格来做到这一点。它看起来像这样:“dateOfBirth”:[1995,10,12]以上是关于插入数据时出错 java.time.LocalDate 在 SpringBoot 中包含字段 dateOfBirth 类型 LocalDate的主要内容,如果未能解决你的问题,请参考以下文章