JSON-B сериализует ключи Map, используя toString, а не с зарегистрированным адаптером - PullRequest
0 голосов
/ 13 марта 2019

У меня есть служба JAX-RS, которая возвращает Map<Artifact, String>, и я зарегистрировал

public class ArtifactAdapter implements JsonbAdapter<Artifact, String>

, который ударил при десериализации входного параметра, но не при сериализации возвращаемого значения, вместо этогоАртефакт toString () используется.Если я изменяю тип возвращаемого значения на Артефакт, вызывается адаптер.У меня сложилось впечатление, что Карта будет сериализована встроенными способами, а затем будет вызван адаптер для Артефакта.

Каким будет обходной путь?Зарегистрировать адаптер для всей карты?

Я сбросил стек потоков в моей toString, и это подтверждает мои подозрения

    at java.lang.Thread.dumpStack(Thread.java:1336)
Artifact.toString(Artifact.java:154)
at java.lang.String.valueOf(String.java:2994)
at org.eclipse.yasson.internal.serializer.MapSerializer.serializeInternal(MapSerializer.java:41)
at org.eclipse.yasson.internal.serializer.MapSerializer.serializeInternal(MapSerializer.java:30)
at org.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:63)
at org.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:118)
at org.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:74)
at org.eclipse.yasson.internal.JsonBinding.toJson(JsonBinding.java:98)

не склонен ли сериализатор использовать toString в данный момент?

Я пытался

public class Person {
private String name;

public Person(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

}

открытый класс PersonAdapter реализует JsonbAdapter {

@Override
public String adaptToJson(Person obj) throws Exception {
    return obj.getName();
}

@Override
public Person adaptFromJson(String obj) throws Exception {
    return new Person(obj);
}

} ​​

открытый класс Test {

public static void main(String[] args) {
    Map<Person, Integer> data = new HashMap<>();
    data.put(new Person("John"), 23);

    JsonbConfig config = new JsonbConfig().withAdapters(new PersonAdapter());
    Jsonb jsonb = JsonbBuilder.create(config);
    System.out.println(jsonb.toJson(data, new HashMap<Person, Integer>() {
    }.getClass().getGenericSuperclass()));
}

}

, но все равно получилось с toString () Person

Заранее спасибо, Nik

1 Ответ

0 голосов
/ 14 марта 2019

https://github.com/eclipse-ee4j/yasson/issues/110 (в моем случае, поскольку это поставщик по умолчанию для WildFly)

...