网络服务&;Java客户端(使用Eclipse Apache Axis 2自底向上服务)-某些代码会引发异常

网络服务&;Java客户端(使用Eclipse Apache Axis 2自底向上服务)-某些代码会引发异常,java,eclipse,web-services,axis2,Java,Eclipse,Web Services,Axis2,我正在制作自己的web服务,它基于一个邮政编码(从客户端接收)返回一个包含温度、城市、谷歌地图链接和.wav天气报告的对象,作为字节[]。我的web服务实际上使用另一个web服务来获取添加到它的数据。但我的web服务实际做的是,它根据数据生成google地图URL和声音文件 web服务成功地将城市和温度添加到返回的对象中(客户端获取数据),但当web服务尝试为声音文件创建字节数组时,我遇到了问题 首先,我另外创建了一个新类,它位于同一个项目中,与web服务类的代码相同,只是它还有一个主函数,所以

我正在制作自己的web服务,它基于一个邮政编码(从客户端接收)返回一个包含温度、城市、谷歌地图链接和
.wav
天气报告的对象,作为
字节[]
。我的web服务实际上使用另一个web服务来获取添加到它的数据。但我的web服务实际做的是,它根据数据生成google地图URL和声音文件

web服务成功地将城市和温度添加到返回的对象中(客户端获取数据),但当web服务尝试为声音文件创建字节数组时,我遇到了问题

首先,我另外创建了一个新类,它位于同一个项目中,与web服务类的代码相同,只是它还有一个主函数,所以我可以脱机运行它,看看代码是否有效。我使用它来测试在web服务上不起作用的代码。确切地说,这段代码本身运行得非常好:

public class Sound {

  public static byte[] getSound (String text) throws IOException {
    Voice voice;

    VoiceManager voiceManager = VoiceManager.getInstance();
    voice = voiceManager.getVoice("kevin");
    FreeTTS freeTTS = new FreeTTS(voice);
    freeTTS.setAudioFile("recording.wav");
    freeTTS.startup();
    voice.allocate();      
    voice.speak(text);
    voice.deallocate();
    freeTTS.shutdown();

    File f = new File("recording.wav");

    if (f.exists() && !f.isDirectory()) {
      System.out.println("it exists");
    }
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    BufferedInputStream in = new BufferedInputStream(new FileInputStream("recording.wav"));

    int read;
    byte[] buff = new byte[1024];
    while ((read = in.read(buff)) > 0) {
      out.write(buff, 0, read);
    }
    out.flush();
    byte[] audioBytes = out.toByteArray();

    return audioBytes;
  }

  public static void main (String[] args) throws IOException {
    byte[] data = Sound.getSound("Some text");
    System.out.println(data);
  }
}
但是当web服务运行此代码时,会发生异常。 首先,这意味着recording.wav已经存在(使用上面的测试类生成),我并没有生成新的.wav,我正在尝试从recording.wav生成一个字节[]。在测试类中,它表示“recording.wav”存在,而当运行的web服务检查文件是否存在时,我得到一个空指针异常,即使web服务和测试类位于同一个项目/文件夹中

java.io.FileNotFoundException:recording.wav(系统找不到指定的文件) 位于java.io.FileInputStream.open0(本机方法)

其次,如果我试图在运行的web服务上生成声音文件,则会引发以下异常:
VoiceManager.getInstance()

客户端堆栈跟踪(仅复制第一行):

Web服务方面:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:212)

我已经尝试重新部署web服务和客户端,但没有任何更改。现在,为什么作为web服务运行时会出现这些错误,虽然它们在脱机运行时工作正常?

要修复FileNotFoundException,您应该检查当前的工作目录,因为它很可能与源目录和测试目录不同

或者,您可以使用Java来加载文件。无论当前工作目录如何,都可以通过从项目目录中搜索来工作。所以

URL url = Sound.class.getClassLoader().getResource("/path/to/recording.wav");
File f = new File(url.toURI());

我很确定我找到了答案。web服务使用的路径与项目中的普通类不同。关于
java.lang.reflect.InvocationTargetException
,web服务也不像其他Calss那样使用相同的
lib
文件夹,我不得不将我所有的
.jar
文件复制到
WebContent/web-INF/lib
文件夹中。

有趣的是,我检查了录音的路径,这是:C:\Users\Me\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\webseric1337\WEB-INF\classes\recording.wav,让我们看看我是否可以利用这些信息。如果我对测试类也这样做,录音在另一个文件夹中:C:\Users\Me\workspace\WebSerice1337\build\classes\recording.wav由于这个原因,我正在使用url读取声音文件,所以这很好。我猜当我使用VoiceManager时,由于类似的原因,有些库无法访问,我还不知道如何解决这个问题。
URL url = Sound.class.getClassLoader().getResource("/path/to/recording.wav");
File f = new File(url.toURI());