休息| @Produces和@Consumes:为什么他们都不会被调用相同的MIME类型

时间:2013-06-17 13:22:34

标签: java rest jersey

JAX-REST中的新手(jersey 1.8 impl)

我有一个资源课程“/ 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()也被称为?

1 个答案:

答案 0 :(得分:6)

你应该记住:

  1. 单个请求只执行一种方法。因此,在单个请求中执行两种方法(或更多)是不可能的;
  2. JAX-RS运行时根据发送到服务器的请求标头值决定应该执行哪一种方法。
  3. JAX-RS运行时尝试匹配:

    • http方法(GETPOST,...),带有正确的注释(@GET@POST,...);

    • 使用正确的'/api/something'注释请求路径(@Path);

    • http content-type标题(link),其中包含正确的@Consumes注释;

    • 带有propper accept注释的http @Produces标头;

    因此(例如)@Produces注释并不表示带注释的方法会产生某些东西。它表示当匹配accept header将包含在请求中时将执行该方法。

    如果您需要更多信息,请参阅RestFull webservices我建议您阅读以下资源: