仅使用编译时编织尝试为大量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接口(interface),但是在任何地方都没有toString()方法的迹象。如果我将方法名称更改为不与Object.toString()冲突的名称(例如toString2()),则会真正添加该方法。
关于如何克服这一点的任何线索?也许是仅针对包
@Around
之下的子类的截取点上的com.mycompany.dto
建议可拦截java.lang.Object.toString()的执行?还是强制混合发生的方法? 最佳答案
我尝试了您的方案并可以复制该行为,还尝试了@DeclareMixin
而不是@DeclareParent
的组合,但也无法使其正常工作。虽然对我有用,但是以这种方式使用 native aspectj:
public aspect JsonToStringAspect {
private interface JsonToString {}
declare parents: com.mycompany.dto.* implements JsonToString;
public String JsonToString.toString() {
return "Overridden String through JsonToStringAspect";
}
}
我猜想使用
@AspectJ
可能不可行,并且只能通过 native 方面实现。