Все мои сущности имеют свой собственный класс идентификации, например, 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
.