JAX-REST的新手(球衣1.8展示)
我有一个资源“ / hello”类
package com.lbs.rest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class Test {
//-- produces MIME type text/plain
@GET
@Produces(MediaType.TEXT_PLAIN)
public String thankYouTxt(){
System.out.println("thankYouTxt");
return "thankYouTxt\n";
}
//-- consumes MIME type text/plain
@GET
@Consumes(MediaType.TEXT_PLAIN)
public String thankYouInputTxt(){
System.out.println("thankYouInputTxt");
return "thankYouInputTxt";
}
//-- produces MIME type text/html
@GET
@Produces(MediaType.TEXT_HTML)
public String thankYouHTML(){
System.out.println("thankYouHTML");
return "thankYouTxtHTML";
}
//-- consumes MIME type text/html
@GET
@Consumes(MediaType.TEXT_HTML)
public void thankYouInputHTML(){
System.out.println("thankYouInputHTML");
//return "thankYouInputHTML";
}
//-- produces MIME type text/xml
@GET
@Produces(MediaType.TEXT_XML)
public String thankYouXML(){
System.out.println("thankYouXml");
return "<?xml version=\"1.0\"?> <message>thankYouTxt</message>";
}
//-- consumes MIME type text/xml
@GET
@Consumes(MediaType.TEXT_XML)
public String thankYouInputXML(){
System.out.println("thankYouInputXML");
return "thankYouInputXML";
}
}
当我发送带有标头
Content-Type : text/html
的请求时,我希望同时调用@Produces
和@Consumes
带注释的方法thankYouHTML()
和thankYouInputHTML()
。但是只有
@Produces thankYouHTML()
方法被调用?为什么?为什么不同时调用@Consumes
带注释的方法thankYouHInputTML()
? 最佳答案
您应该记住:
单个请求仅执行一种方法。因此,不可能在单个请求中执行两个(或多个)方法。
JAX-RS运行时根据发送到服务器的请求标头值来决定应执行哪种方法。JAX-RS
运行时尝试匹配:
具有适当注释(GET
,POST
,...)的http方法(@GET
,@POST
,...);
具有正确'/api/something'
批注的请求路径(@Path
);
具有适当content-type
注释的http @Consumes
标头(link);
http accept
标头,带有适当的@Produces
批注;
因此(例如)@Produces
注释并不表示注释的方法会产生某些结果。它表示在请求中包含匹配的accept header
时将执行该方法。
如果您需要RestFull Web服务的更多信息,我建议您阅读以下资源:
rfc2616
RESTful Java with JAX-RS - By Bill Burke