Попытка сплести метод toString() по умолчанию для большого количества DTO, используя только сплетение во время компиляции. Цель состоит в том, чтобы вернуть представление JSON с помощью библиотеки Джексона.
Следуя рекомендациям в этой статье, превратили ее в конфигурацию аспекта в стиле аннотаций и закончился следующим кодом:
public @Aspect class JsonToStringAspect {
private interface JsonToString {
public String toString();
}
public static class JsonToStringImpl implements JsonToString {
public String toString() {
return SingletonJsonEncoder.toJsonString(this);
}
}
@SuppressWarnings("unused")
@DeclareParents(value = "com.mycompany.dto..*", defaultImpl = JsonToStringImpl.class)
private JsonToString implementedInterface;
}
Выполнение javap
для результирующих классов показывает, что они реализуют интерфейс JsonToString, но нигде нет признаков метода toString().
Если я изменю имя метода на то, что не конфликтует с Object.toString() (например, toString2()), метод действительно будет добавлен.
Любые подсказки о том, как преодолеть это? Может быть, совет @Around
по pointcut, который перехватывает выполнение java.lang.Object.toString(), только для дочерних классов ниже пакета com.mycompany.dto
? Или способ заставить миксин произойти?
toString()
. Очевидно, это помогает сохранить вашиtoString()
методы DRY, но это также немного неочевидной магии. это усложняет кодовую базу. - person SingleShot   schedule 13.01.2013