【发布时间】:2018-02-24 10:00:12
【问题描述】:
假设有一个简单的类Student
@Data @NoArgsConstructor @AllArgsConstructor
public class Student {
private Integer age;
private String name;
}
在 aop.xml 中使用 Spring AOP 添加日志记录方面
<aop:config>
<aop:aspect id="log" ref="logging">
<aop:pointcut id="selectAll" expression="execution(* com.tutorial.Student.getName(..))"/>
<aop:before pointcut-ref="selectAll" method="beforeAdvice"/>
<aop:after pointcut-ref="selectAll" method="afterAdvice"/>
</aop:aspect>
</aop:config>
<bean id="student" class="com.tutorial.Student">
<property name="name" value="Zara" />
<property name="age" value="11"/>
</bean>
排除方面字段
public class ExcludeAspects implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
if(f.getName().startsWith("CGLIB$"))
return true;
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
main,注意第一个bean的输出是空的(“{}”):
public static void main(String[] args) {
Gson gson = new GsonBuilder().setPrettyPrinting().addSerializationExclusionStrategy(new ExcludeAspects()).create();
ApplicationContext context = new ClassPathXmlApplicationContext("aop.xml");
//return "{}"
Student student = (Student) context.getBean("student");
gson.toJson(student);
//works fine
Student student2 = new Student(11,"Zara");
gson.toJson(student2);
}
更新根据接受的答案,unProxy 为我工作。
【问题讨论】:
-
我认为您不应该对原来的问题进行太多更改,而是评论答案。现在阿伦的回答似乎有点无关紧要。调用
context.getBean("student");是否使用Gson 反序列化?你有没有记录那个学生,否则它有什么价值?对于调试,您可以将name和age设置为某个默认调试值。 -
2 个 bean 的
name和age的值在运行时相同。 -
不确定这是否不再是 AOP 的事情,但可能与您获得的
studentbean 可能是代理有关。另请参阅this queation。
标签: java gson spring-aop lombok cglib