JsonDeserializer весной MVC для полиморф c тип - PullRequest
0 голосов
/ 09 апреля 2020

Все мои сущности имеют свой собственный класс идентификации, например, UserId, который реализует интерфейс EntityId.

Я хотел бы иметь возможность использовать эти классы в @RequestBody HTTP-запроса, например Итак:

public class EditUserRequest {

  UserId userId;
  String name;

  // getters and setters
}

Я использую Джексона, поэтому для выполнения sh я написал класс, который расширяет JsonDeserializer:

@JsonComponent
public class EntityIdJsonDeserializer extends JsonDeserializer<UserId> {

  @Override
  public UserId deserialize(final JsonParser p, final DeserializationContext ctxt) throws 
  IOException {

    // Get reference to ObjectCodec
    ObjectCodec codec = p.getCodec();

    // Parse "object" node into Jackson's tree model
    JsonNode node = codec.readTree(p);

    return new UserId(UUID.fromString(node.asText()));
  }
}

, который отлично работает для UserId. Однако я не хочу создавать JsonDeserializer класс, подобный этому, для каждого класса, который расширяет EntityId. Есть ли способ, которым я могу сделать это легко, без необходимости повторять что-то (например, аннотации или необходимость создавать новый класс JsonDeserializer каждый раз, когда добавляется новый класс *Id?

Я видел примеры в StackOverflow, но ни один из них не использует Spring MVC, и все они используют аннотации, которые все еще должны быть установлены для каждого возможного типа polymorhpi c.

Моя идея состояла бы в том, чтобы получить classType и с помощью отражения получить конструктор и затем создайте экземпляр. Так как все классы *Id имеют только 1 конструктор, который принимает объект UUID.

...