So I've been trying to use Java Records as data holders for JSONB serialisation and deserialisation. And it works well, until I encountered the following:
jakarta.json.bind.JsonbException: Cannot create instance of a record: class SomeClass, Multiple constructors found.
It turns out, I can put in an annotation @JsonbCreator on it, as explained in reference [1].
It just takes a bit of work, as I cannot put the annotation on top of a record class, it needs to be put on a constructor. The way this works, is to create a compact constructor in the record.
The compact constructor is usually used to put in some sort of validation in the record class upon instantiation, but here we need it for the annotation @JsonbCreate.
Brian Goetz in the comments of reference [2] indicates that this is the proper way to do it.
Unfortunately, it causes one of those "empty constructors" messages of SonarLint.
Warning:(31, 10) Remove this redundant constructor which is the same as a default one.
I assume SonarLint will fix this eventually.
For completeness, my code:
public record AdminItem(Integer id, String belongsto, Long room, String shopkeeper, String owner, LocalDateTime creation) { @JsonbCreator public AdminItem { // empty constructor, because I need to put the annotation @JsonbCreator somewhere. } public AdminItem(Item item) { this(item.getId(), item.getBelongsTo() == null ? null : item.getBelongsTo().getName(), item.getRoom() == null ? null : item.getRoom().getId(), null, item.getOwner() == null ? null : item.getOwner().getName(), item.getCreation()); } }
References
- [1] Carlos Chacin - 💾 Java 14 Records 🐞 with JakartaEE JSON-B
- https://carloschac.in/2020/04/20/java-records-jsonb/
- [2] StackOverflow - Constructor annotation on java records
- https://stackoverflow.com/questions/67168624/constructor-annotation-on-java-records
No comments:
Post a Comment