【发布时间】:2019-08-26 04:07:31
【问题描述】:
我正在尝试使用 JPA 保存一个实体,但为 Optional 类型的字段获取 NotSerializableException。
这里我的目标是以 JSON 序列化形式存储自定义对象(这里是 Grade 类型)。
[学生.java]
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Size(min = 3, max = 20)
private String name;
@Lob
private Grade grade;
public Student() {
}
[等级.java]
public class Grade implements Serializable {
/**
*
*/
private static final long serialVersionUID = 7351334541533041431L;
private Optional<Integer> marks;
public Optional<Integer> getMarks() {
return marks;
}
public void setMarks(Optional<Integer> marks) {
this.marks = marks;
}
@Override
public String toString() {
return "Grade [marks=" + marks + "]";
}
}
[StudentRepository.java]
public interface StudentRepository extends JpaRepository<Student, Long> {
public Student findByName(String name);
}
[StudentRepositoryTest.java]
@RunWith(SpringRunner.class)
@DataJpaTest
public class StudentRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private StudentRepository studentRepository;
@Test
public void whenFindByName_thenReturnEmployee() {
// given
Student alex = new Student("alex");
Grade grade = new Grade();
grade.setMarks(Optional.ofNullable(90));
alex.setGrade(grade);
entityManager.persist(alex);
entityManager.flush();
// when
Student found = studentRepository.findByName(alex.getName());
System.out.println(found);
// then
assertThat(found.getName()).isEqualTo(alex.getName());
}
}
运行上述测试后,marks 类中的 marks 字段出现以下异常:
Caused by: java.io.NotSerializableException: java.util.Optional
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:115)
... 49 more
我已包含以下依赖项以支持 Jackson 的 java8 数据类型:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
Spring boot 版本:2.1.6.RELEASE
在https://github.com/Omkar-Shetkar/spring-repo-test分享了相同的代码
这里可能缺少什么?
【问题讨论】:
标签: java spring-boot jackson