加载jar包下面的resources目录下的文件

 

  • 背景(如并不关心,可以直接跳至最后一项实现代码):

现在这个项目会调用一个远程的webservice叫做NP,但是一直都没有准备好提供给我们用,我们的web application又需要继续开发。于是我们使用了dreamhead所写的moco(https://github.com/dreamhead/moco),为我们模拟远程的NP。Moco做的事情是启动一个服务,监听某已配置端口,接收到一个request后,判断这个请求然后返回相应的response。

Moco提供了两种方式来配置。一种是使用Plugin,通过Json文件配置request和response,运行web application前启动好moco的server,就可以工作了。另一种是内嵌的moco,将moco引入在java代码中启动和配置,这种方式不需要运行项目前启动moco的server。

我们发送的request是xml格式的,期望得到的response也是xml格式的,于是我们定义了许多期望得到的xml文件,配置moco通过判断request返回对应的response。

问题:moco不是引入在webapp的module下面的,而是一个叫service的module,且这些response的xml都放在service这个目录下面的resources目录中。moco有两个方法可以返回两种类型,一个是方法是file,需要参数是路径(相对和绝对都可以);另一个是方法text,需要的参数是string。可以希望能在代码中加载到用于response的xml的文件。

 

  • 项目目录结构:
    加载jar包下面的resources目录下的文件
    +---qdem
    |    |
    |    +---qdem-jetty
    |    +---qdem-services
    |    |     |
    |    |     +---src
    | | | |
    | | | +---com.qing | |
    +---resources
    | | |
    | | ---response1.xml |
    +---qdem-webapp | +---qdem-tests
    加载jar包下面的resources目录下的文件

     

  • 打包后的项目结构:

Maven在将webapp打包成war包的时候,将qdem-services打成了一个jar包,提供给webapp使用,由于moco是在这个jar包中被使用,所以只列出qdem-services这个jar包的目录结构。

qdem-services.jar
|
|---resonces1.xml
|---+---com.qing

 

  • 加载resource目录下文件的方法:

当在配置Moco的response的时候,使用file方法传入xml的相对路径,即resources下文件的路径,但是单元测试能通过,但在在打完war包后,就找不到response1.xml文件了。所以这个方法是不成功的。

所以我们只有使用text方法,传入response.xml的string。可以使用class的ClassLoader去加载在resources目录下的文件。再将加载的文件转换为string。

我的Moco的配置在类MocoHttpEndPoint

// file("response1.xml"); //does not work

InputStream inputStream = MocoHttpEndPoint.class.getClassLoader().getResourceAsStream("response1.xml"); String value = IOUtils.toString(inputSteam, "UTF-8");
text(value);

加载jar包下面的resources目录下的文件

上一篇:Kubernetes


下一篇:Hibernate Tools