行为@RequestMapping通过RestTemplate和Web浏览器生成

时间:2014-10-28 21:19:55

标签: spring spring-mvc spring-3 spring-4

我正在使用Spring 4.0.7

我有一个实体,用JSON和XML表示。

@Entity
@Table(name="person")
@XmlRootElement(name="person")
@XmlType(propOrder = {"id",…,"address"})
public class Person implements Serializable {

我有以下方法:

@RequestMapping(value="/{id}/customized", 
                method=RequestMethod.GET,
                produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<Person> getPersonCustomized(@PathVariable Integer id){
    logger.info("PersonRestResponseEntityController  - getPersonCustomized - id: {}", id);
    Person person = personMapRepository.findPerson(id);
    return new ResponseEntity<>(person, HttpStatus.FOUND);//302     
}

通过RestTemplate,我可以执行以下操作:

public Person getPersonCustomized(String id, String type){

    HttpHeaders headers = new HttpHeaders();

    if(type.equals("JSON")){
        logger.info("JSON");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    }
    else if(type.equals("XML")){
        logger.info("XML");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML));
    }
    else if(type.equals("MIX01")){
        logger.info("MIX01 - XML _ JSON");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));
    }
    else if(type.equals("MIX02")){
        logger.info("MIX01 - JSON _ XML");
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));
    }

    ResponseEntity<Person> response =
            restTemplate.exchange("http://localhost:8080/spring-utility/person/{id}/customized",
                                  HttpMethod.GET,
                                  new HttpEntity<Person>(headers),  
                                  Person.class,
                                   id
                                 );
    logger.info("status: {}", response.getStatusCode());
    logger.info("body: {}", response.getBody());

    return response.getBody();
}

该应用程序正常。没有例外等。

但我对以下内容感到困惑:

如果我在任何网络浏览器中输入网址:

  • http://localhost:8080/spring-utility/person/2/customized

自动呈现内容的预期方式,但始终采用XML格式。

即使我有:

  • produces={MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})

我假设应首先选择JSON(似乎顺序无关紧要)

无论如何,总是选择XML如何默认。

因此:

  1. 为什么选择XML如何使用默认格式?
  2. 两个

    根据API HttpHeaders for the method setAccept

      

    setAccept

    public void setAccept(List<MediaType> acceptableMediaTypes)
    
    Set the list of acceptable media types, as specified by the Accept header.
    
    Parameters:
        acceptableMediaTypes - the acceptable media types
    

    它有一个List<MediaType>,所以我决定测试和玩。

    如何查看上面显示的代码,我有两个场景

    • headers.setAccept(Arrays.asList(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON));
    • headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML));

    每个人代表

    • Accept=application/xml, application/json
    • Accept=application/json, application/xml

    通过RestTemplate我总能看到已经转换或转换的Person对象,所以没有什么新东西

    因此,只需使用Poster

    如果我设置标题值

    • Accept=application/xml, application/json 然后响应是XML格式
    • Accept=application/json, application/xml 然后响应是JSON

    因此,我假设第二个被忽略。

    如果我是对的,那么

    1. setAccept(List<MediaType> acceptableMediaTypes)有什么意义? 我的意思是发送List
    2. 如果我们发送一个列表,那么有感觉是否有用应该
    3. 发送接受
    4. 列表时的预期行为是什么?

1 个答案:

答案 0 :(得分:1)

文档说明了一切:

  

设置可接受的媒体类型列表

因此,如果您将XML和JSON作为可接受的媒体类型发送,并且服务器能够生成至少一种媒体类型,则它将返回成功的响应。如果服务器无法生成任何这些,它将返回错误响应。

这也回答了你的第一个问题:浏览器可能只发送HTML和XML作为可接受的媒体类型。您的服务器无法生成HTML,但能够生成XML,因此返回给浏览器。