如果给定条件为假,如何编写注释/方面以不输入方法但返回 null?
Posted
技术标签:
【中文标题】如果给定条件为假,如何编写注释/方面以不输入方法但返回 null?【英文标题】:How to write an annotation/aspect to not enter a method but return null if a given condition is false? 【发布时间】:2018-12-15 01:18:52 【问题描述】:我目前有一个要求,如果给定条件为假,我需要从 100 个方法中返回 null。我正在考虑为此使用 Java Annotations 或 Spring Aspects,这样我就不必到处编写 if-else 代码块了。关于我们如何使用 Java Annotations 或 Spring Aspects 来做到这一点的任何想法?
任何指针都可能会有所帮助。
【问题讨论】:
AOP 将是一个选项,但如果没有更多信息,答案将只是猜测。你想返回的方法有什么共同点?如果要编写 AOP 切入点,这是必要的知识。 Ist 是方法签名、包名、类名模式、基类/接口、公共注解、其他东西还是它们的组合?此外,为了决定是使用 Spring AOP 还是 AspectJ:有问题的方法都是公开的吗?请显示示例代码,最好是MCVE。 @kriegaex,感谢您回复,关于“您想要返回的方法有什么共同点?” --> 所有方法基本上都检查一个条件,如果该条件为 TRUE,它们应该返回 null 而不是进一步处理任何事情。 我已经知道了,但这并不能回答我的问题。我询问了这些方法在技术上的共同点,以便能够通过 AOP 将它们挑选出来,而不是关于方面应该添加到这些方法中的行为。 @kriegaex,只有 if 条件检查对他们来说是通用的,没有别的。它们也在同一个 java 类中,否则其他一切都不同 - 它们的参数、返回类型、方法签名等 - 一切都不同。 看看我的新问题是否清楚 - ***.com/questions/53791423/… 【参考方案1】:如果我理解正确,Spring @Conditional
注释就是你想要的。
您创建了一些实现 Spring 的 Condition
接口的公共类:
public class Test implements Condition
...
然后你将前面提到的注释与作为公共类参数的参数一起使用。
@Conditional(Test.class)
public Object someMethod(boolean context)
/*and so do some logics; if the value of 'context' variable is false, you can return
null; otherwise, just return like this*/
return new someMethodImpl1();
希望我能帮上忙。我很高兴任何形式的更正。干杯!
【讨论】:
嗨@dima_mayd,你能举个例子吗 - 关于测试中应该包含什么,即我的用例的“匹配”方法的示例实现? 我不想注册任何组件/bean,只想执行一个基于布尔值的方法。如果这更清楚,请参阅我的这个新问题 - ***.com/questions/53791423/…【参考方案2】:没有 spring 你可以使用纯 AspectJ:
Demo.java : 我们要修改的方法示例
public class Demo
public String boom(String base)
return base;
DemoAspect.aj : 配置文件。 Getting started。在 AspectJ 中,pointcuts 在程序流中挑选出某些连接点。为了实际实现横切行为,我们使用建议。 Advice 汇集了一个切入点(用于挑选连接点)和一段代码(在每个连接点处运行):之前、周围、之后...
public aspect DemoAspect
pointcut callBoom(String base, Demo demo) :
call(String Demo.boom(String)) && args(base) && target(demo);
String around(String base, Demo demo) : callBoom(base, demo)
if ("detonate".equals(base))
return "boom!";
else
return proceed(base, demo);
DemoTest.java
public class DemoTest
@Test
void name()
Demo demo = new Demo();
assertEquals("boom!", demo.boom("detonate"));
assertEquals("fake", demo.boom("fake"));
将依赖添加到pom.xml
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
还有插件,注意版本。例如 1.11 插件需要 1.8.13 库。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.11</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8 </encoding>
</configuration>
<executions>
<execution>
<goals>
<!-- use this goal to weave all your main classes -->
<goal>compile</goal>
<!-- use this goal to weave all your test classes -->
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
更多细节的好例子,Baeldung。 Official documentation.
【讨论】:
如果需要spring AOP的例子,请留言。 是的@uli,我正在寻找一个spring AOP 示例。谢谢。 如果这有助于您提供更好的清晰度,请检查我的这个问题。我的问题 - ***.com/questions/53791423/… 我在你的第二个问题下添加了 spring 示例。以上是关于如果给定条件为假,如何编写注释/方面以不输入方法但返回 null?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写自定义的 gradle 任务以不忽略 Findbugs 违规但在分析完成后失败
如果条件为假,我可以在Rust中使用什么运算符来返回特定错误?