我正在寻找一种方法来向 OSGI 环境中的 JAX-RS 资源添加某些功能。注释似乎是一种干净的方法来做到这一点,我已经在 Spring 框架中看到了它的完成(没有经验)。诸如 @Transactional 之类的注释,或者(我想做的,需要在用户上设置权限标志)@Permission(CREATE)。然而,我对如何在 OSGI 环境中执行此操作有点困惑。
添加方面的正常方法(是吗?)是注册包装原始服务的方面服务。如果我查对了,JAX-RS 资源会被跟踪并连接到 HttpService。 JAX-RS 资源不实现接口(interface),需要动态创建代理。
我如何动态生成 OSGI 方面服务/资源,以有效地隐藏原始资源,使其不被 JAX-RS 跟踪器挂接到 HttpService?我对现有 AOP 框架的经验为零,对 AOP 本身几乎一无所知。
最佳答案
在 Java EE 和 Spring 世界中,使用拦截器并基于注释定义附加行为是很常见的。 OSGi中也有一些解决方案,有一个RFP支持EJB注释。
不过,我有不同的看法。虽然这看起来很酷,但它也很神奇。请参阅"Why not annotations, interceptors and other magic?"这一章README我写下原因的文件。该项目实现了您希望通过@Transactional 注解实现的逻辑,但它仅使用函数式接口(interface)。
我认为最好用 lambda 表达式来思考以实现您想要的目标(请参阅链接后面的 java 8 示例)。如果不是 Java 8,您仍然可以使用匿名类(请参阅链接后面的 jave 7 和上面的示例)。使用匿名类,您的代码看起来会更难看,但您的代码的作用会非常清楚。
其他人可能不喜欢我的回答。三年前,我是注释扫描、编织和拦截器的最大粉丝之一。经过几次头痛之后,我成为了这个“神奇”概念的敌人。
关于java - 向 OSGi JAX-RS 资源添加方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23654067/