У меня есть образец объекта (приведен ниже), который предназначен для использования с JAXB, JSON-B и JPA. Я написал несколько модульных тестов для проверки вывода, но JSON-B меня немного смущает. Когда я десериализую только что сериализованный объект, продукты не совпадают. А именно, набор не десериализуется, хотя он был сериализован нормально.
Я начал с JAXB и смог заставить его работать должным образом.
Мне пришлось создать каталог. класс, чтобы заставить Set правильно обрабатывать, а затем создал XmlJavaTypeAdapter для обработки Path.
Поскольку кажется, что все идет только в одном направлении, я попытался просто создать JsonbDeserializer, но использование нового JsonbConfig().withDeserializers(new DirectorySetDeserializer()), похоже, не сработало. На самом деле он вообще не использовал этот класс.
Идея состоит в том, чтобы иметь возможность использовать один объект для JAXB, JSON и JPA поверх REST, что оказывается намного сложнее. чем я мог себе представить.
Я добавил модульные тесты, чтобы придать мне больше уверенности в том, что
@POST
@Consumes({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Response persistReview(Review review) {
...
}
должно было работать так, как ожидалось. (Конечно, нет)
Maven POM:
jakarta.json.bind
jakarta.json.bind-api
3.0.1
org.eclipse
yasson
3.0.2
Класс каталога (содержится в наборе):
@XmlAccessorType(XmlAccessType.FIELD)
public class Directory {
@XmlElement
@XmlJavaTypeAdapter(ArtifactDirectoryTranslator.class)
private Path path;
public Directory() {}
public Directory(Path path) {
this.path = path;
}
public Path getPath() {
return path;
}
public void setPath(Path path) {
this.path = path;
}
}
Класс JAXB/JSONB/Entity:
@XmlRootElement(name = "review")
@XmlAccessorType(XmlAccessType.FIELD)
public class Review {
@XmlElementWrapper(name = "artifact-directories")
private final Set directories = new HashSet();
public Review addDirectory(Path dirPath) {
directories.add(new Directory(dirPath));
return this;
}
public Set getDirectories() {
return directories;
}
public void setDirectories(Set directories) {
// done this way for JPA/Hibernate
this.directories.clear();
this.directories.addAll(directories);
}
}
Модульный тест:
@Test
public void testJsonb() {
Review uut_review = new Review();
uut_review.addDirectory(Path.of("/some/path/1"));
uut_review.addDirectory(Path.of("/some/path/2"));
JsonbConfig config = new JsonbConfig().withFormatting(true);
Jsonb jsonb = JsonbBuilder.newBuilder().withConfig(config).build();
// totally fine: {"directories":[{"path": "/some/path/1"}, {"path": "/some/path/2"}]}
String jsonResult = jsonb.toJson(uut_review);
System.out.println(jsonResult);
// not so good: {"directories":[]}
Review actualReivew = jsonb.fromJson(jsonResult, Review.class);
String jsonResult2 = jsonb.toJson(actualDataReivew);
System.out.println(jsonResult2);
}
Выходные данные модульного теста:
{
"directories": [
{
"path": "/some/path/1"
},
{
"path": "/some/path/2"
}
]
}
{
"directories": [
]
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ing-genera
Jsonb.fromJson не десериализует набор, созданный из строки JSON, созданной Jsonb.toJson(objectWithSet). ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение