JAXRS:一个简单的例子中没有消息正文阅读器?

时间:2014-10-09 14:59:21

标签: jax-rs

我不明白为什么会发生这种情况:当我在名为" process"的带注释的java类中明确声明输入的文件名时,一切都很完美:

@GET
public static void process() throws IOException {
    File file = new File("a.pdf");
    FileUtils.writeStringToFile(new File("a.pdf" + ".exported"), menu.parseToString(file));
}

但是,当我尝试将文件名作为参数传递时,并通过运行配置配置eclipse以提供适当的参数(" a.pdf"的路径):

@GET
public static void process(String[] args) throws IOException {
    File file = new File(args[0]);
    FileUtils.writeStringToFile(new File(args[0] + ".exported"), menu.parseToString(file));
}

当我调用该服务时,它失败并显示错误:

Oct 09, 2014 9:44:55 AM org.apache.cxf.jaxrs.utils.JAXRSUtils readFromMessageBody
WARNING: No message body reader has been found for request class String[], ContentType :    
application/octet-stream.

我是jax rs的新手。我是否会错过任何注释?非常感谢你......

1 个答案:

答案 0 :(得分:2)

无效的Java语法

public static void process("a.pdf") throws IOException {
  // ...        
}

是无效的Java语法。每个IDE和javac都会抱怨它。 Eclipse说:

  

令牌上的语法错误"" a.pdf"",删除此令牌

application/octet-stream作为正文

您似乎尝试使用GET发出Content-Type: application/octet-stream请求(您以某种方式点击了这个文件')。这有两个问题:

  1. GET请求通常没有正文,只有标题。
  2. 编码为application/octet-stream的字节体无法映射到String[],因为JAX-RS无法知道如何解释字节。
  3. 你可能想要什么

    看起来您希望使用文件名作为请求参数发出GET请求(与不同)文件在请求的正文中)。你可以这样做:

    GET http://example.com/service?filename=foo.pdf
    

    然后可以使用以下JAX-RS来为此请求提供服务:

    @GET
    public Response service(@QueryParam("filename") String filename) {
      // use filename to open a File and do something with it
    }
    

    请注意使用@QueryParamservice允许filename=foo.pdf从请求网址中提取{{1}}。