纯Java和Grails之间的反射差异

2020年11月30日 76点热度 0条评论

我正在使用公司内部开发的一组API与组织中的一些常见中央服务进行通信。可以通过运行时配置动态配置API,以根据系统需要使用多种传输协议(protocol)。

内部API的集合耦合到IBM WebService thinclient.jar以配置和调用所有必要的Web服务。我使独立的原型(prototype)顺利运行,但是需要将该功能集成到Grails中正在开发的其他几个服务中。

这是事情崩溃的地方。在我编写的代码中,我们只是调用工厂方法,并使用该方法来获取客户 session ,然后继续进行业务逻辑。简单。使用调试器并深入研究API getClient()调用,我可以看到它获得了通用的传输配置,然后将其绑定(bind)到SOAP传输配置。从这里开始,路径是纯独立Java服务还是在Grails应用程序中运行的服务。

  • 在纯Java独立版本中,此绑定(bind)到一个com.ibm.ws.webservice.engine.client.Service其中
    调用initService()方法,一切正常。
  • 在Grails应用程序中,包括相同的Java代码,相同的位置
    在代码调用中com.springsource.loaded.ri.ReflectiveIntercepter,然后在
    在 Spring 加载的API中进行了很多往复操作,最终抛出了一个
    java.lang.reflect.InvocationTargetException。
  • 在Grails中如何使反射与纯Java中的反射相同,是否有任何技巧或想法?

    为了达到这一点,我已经尝试了多种变体,但是我快要走到尽头了。理想情况下,最简单的方法是管理同时管理我们的业务逻辑和与这些内部系统对话的Java代码的Grails服务,因此,我希望将所有东西(Grails和我的Java服务代码)一起工作。我短暂地尝试构建一个独立的服务代码及其所有依赖关系的JAR,但是在Grails中尝试使用依赖关系时,存在链式的依赖关系冲突。我最后的选择是将我的Java服务与Grails服务中的业务逻辑分开站起来,只进行从Grails服务到Java服务的调用。这不理想。

    解决方案如下:

    当您偶然发现答案时很容易... ;-)

    如果我在IDEA中将运行配置设置为使用-noreloading选项,则Grails服务将按预期运行。

    grails -noreloading run-app
    

    这样可以阻止Grails / IDEA离开钩子(Hook)以即时重新加载类(class)。

    是否对Grails或SpringSource Loader类中的错误有任何想法?