插入数据时出错 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的主要内容,如果未能解决你的问题,请参考以下文章

将日期插入 sql 数据库时出错?

将数据插入 HIVE 表时出错

将 xmlfile 插入数据库时​​出错

将数据插入 Hive 分区表时出错

通过 PHP 将数据插入 MySQL 表时出错

插入 Cast 数据和空字段 C# 时出错