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运行时尝试匹配:


具有适当注释(GETPOST,...)的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

10-07 19:20