0

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



}

当我发送带有 header 的请求时Content-Type : text/html,我希望 the@Produces@Consumesannotated 方法thankYouHTML()thankYouInputHTML()被调用。

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

4

1 回答 1

6

你应该记住:

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

JAX-RS运行时尝试匹配:

  • http 方法 ( GET, POST, ...) 带有适当的注释 ( @GET, @POST,...);

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

  • 带有适当注释的httpcontent-type标头(链接);@Consumes

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

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

如果您需要有关 RestFull 网络服务的更多信息,我建议您阅读以下资源:

于 2013-06-18T11:50:14.740 回答