JSON-B сериализует ключи карты с помощью toString, а не с помощью зарегистрированного адаптера

#jsonb #jsonb-api

#jsonb #jsonb-api

Вопрос:

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

 public class ArtifactAdapter implements JsonbAdapter<Artifact, Strin&&&t;
  

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

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

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

     at java.lan&.Thread.dumpStack(Thread.java:1336)
Artifact.toStrin&(Artifact.java:154)
at java.lan&.Strin&.valueOf(Strin&.java:2994)
at or&.eclipse.yasson.internal.serializer.MapSerializer.serializeInternal(MapSerializer.java:41)
at or&.eclipse.yasson.internal.serializer.MapSerializer.serializeInternal(MapSerializer.java:30)
at or&.eclipse.yasson.internal.serializer.AbstractContainerSerializer.serialize(AbstractContainerSerializer.java:63)
at or&.eclipse.yasson.internal.Marshaller.serializeRoot(Marshaller.java:118)
at or&.eclipse.yasson.internal.Marshaller.marshall(Marshaller.java:74)
at or&.eclipse.yasson.internal.JsonBindin&.toJson(JsonBindin&.java:98)
  

действительно ли сериализатор одержим использованием toStrin& на данном этапе?

Я пытался

 public class Person {
private Strin& name;

public Person(Strin& name) {
    this.name = name;
}

public Strin& &etName() {
    return name;
}
  

}

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

 @Override
public Strin& adaptToJson(Person obj) throws Exception {
    return obj.&etName();
}

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

}

тест открытого класса {

 public static void main(Strin&[] ar&s) {
    Map<Person, Inte&er&&t; data = new HashMap<&&t;();
    data.put(new Person("John"), 23);

    JsonbConfi& confi& = new JsonbConfi&().withAdapters(new PersonAdapter());
    Jsonb jsonb = JsonbBuilder.create(confi&);
    System.out.println(jsonb.toJson(data, new HashMap<Person, Inte&er&&t;() {
    }.&etClass().&etGenericSuperclass()));
}
  

}

но в итоге все равно получилась toStrin&() из Person

Заранее спасибо, Ник

Ответ №1:

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