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

art*_*hur 0 java rest jersey

JAX-REST的新手(jersey 1.8 impl)

我有一个资源课程"/你好"

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";
    }



}
Run Code Online (Sandbox Code Playgroud)

当我发送的请求有一个头Content-Type : text/html,我希望无论是@Produces@Consumes注解的方法thankYouHTML()thankYouInputHTML()被调用.

但只有@Produces thankYouHTML()方法被调用?为什么?为什么@Consumes注释方法thankYouHInputTML()也没有被称为?

pWo*_*Woz 6

你应该记住:

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

JAX-RS 运行时尝试匹配:

  • HTTP方法(GET,POST,...)与适当的注解(@GET,@POST,...);

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

  • 具有适当注释的http content-type头(链接)@Consumes;

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

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

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