尝试使用编译时编织在大量DTO的默认toString()方法中编织。目标是使用Jackson库返回JSON表示。
按照this article中的建议,将其转换为注释式方面配置,最后得到以下代码:
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
建议拦截java.lang.Object.toString()的执行,仅适用于包com.mycompany.dto
以下的子类?还是一种迫使mixin发生的方法?
答案 0 :(得分:2)
我尝试了您的方案并且可以复制行为,我也尝试了@DeclareMixin
而不是@DeclareParent
的组合,并且无法使其工作。对我来说有用的是以这种方式使用原生的方面:
public aspect JsonToStringAspect {
private interface JsonToString {}
declare parents: com.mycompany.dto.* implements JsonToString;
public String JsonToString.toString() {
return "Overridden String through JsonToStringAspect";
}
}
我猜这使用@AspectJ
可能不太可行,并且只有通过原生方面才有可能。