Tôi muốn tuần tự hóa và giải mã hóa một đối tượng không thể thay đổi bằng cách sử dụng com.fasterxml.jackson.databind.ObjectMapper.
Lớp không thay đổi trông như thế này (chỉ có 3 thuộc tính bên trong, getters và constructor):
public final class ImportResultItemImpl implements ImportResultItem {
private final ImportResultItemType resultType;
private final String message;
private final String name;
public ImportResultItemImpl(String name, ImportResultItemType resultType, String message) {
super();
this.resultType = resultType;
this.message = message;
this.name = name;
}
public ImportResultItemImpl(String name, ImportResultItemType resultType) {
super();
this.resultType = resultType;
this.name = name;
this.message = null;
}
@Override
public ImportResultItemType getResultType() {
return this.resultType;
}
@Override
public String getMessage() {
return this.message;
}
@Override
public String getName() {
return this.name;
}
}
Tuy nhiên, khi tôi chạy thử nghiệm đơn vị này:
@Test
public void testObjectMapper() throws Exception {
ImportResultItemImpl originalItem = new ImportResultItemImpl("Name1", ImportResultItemType.SUCCESS);
String serialized = new ObjectMapper().writeValueAsString((ImportResultItemImpl) originalItem);
System.out.println("serialized: " + serialized);
//this line will throw exception
ImportResultItemImpl deserialized = new ObjectMapper().readValue(serialized, ImportResultItemImpl.class);
}
Tôi nhận được ngoại lệ này:
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class eu.ibacz.pdkd.core.service.importcommon.ImportResultItemImpl]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: {"resultType":"SUCCESS","message":null,"name":"Name1"}; line: 1, column: 2]
at
... nothing interesting here
Ngoại lệ này yêu cầu tôi tạo một phương thức khởi tạo mặc định, nhưng đây là một đối tượng bất biến, vì vậy tôi không muốn có nó. Nó sẽ thiết lập các thuộc tính bên trong như thế nào? Nó sẽ hoàn toàn gây nhầm lẫn cho người dùng API.
Vì vậy, câu hỏi của tôi là: Bằng cách nào đó tôi có thể de / serialize các đối tượng bất biến không có hàm tạo mặc định không?