前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Spring实战》摘录 - 23

《Spring实战》摘录 - 23

作者头像
用户1335799
发布2019-07-17 17:44:20
8310
发布2019-07-17 17:44:20
举报

Q: #16.2-1 | 实现RESTful功能的Spring MVC控制器

A:

代码语言:javascript
复制
package spittr.api;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import spittr.Spittle;
import spittr.data.SpittleRepository;

@Controller
@RequestMapping("/spittles")
public class SpittleController {

  private static final String MAX_LONG_AS_STRING="9223372036854775807";

  private SpittleRepository spittleRepository;

  @Autowired
  public SpittleController(SpittleRepository spittleRepository) {
    this.spittleRepository = spittleRepository;
  }

  @RequestMapping(method=RequestMethod.GET)
  public List<Spittle> spittles(
      @RequestParam(value="max",defaultValue=MAX_LONG_AS_STRING)
      @RequestParam(value="count", defaultValue="20") int count) {
        return spittleRepository.findSpittles(max, count);
  }
}

232

Q: #16.2-2 | Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式:

A:

  • 内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式;
  • 消息转换器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。

233

Q: #16.2-3 | 借助Content-NegotiationManager我们所能做到的事情如下所示

A:

  • 指定默认的内容类型,如果根据请求无法得到内容类型的话,将会使用默认值;
  • 通过请求参数指定内容类型;
  • 忽视请求的Accept头部信息;
  • 将请求的扩展名映射为特定的媒体类型;
  • 将JAF(Java Activation Framework)作为根据扩展名查找媒体类型的备用方案。

234

Q: #16.2-4 | ContentNegotiationManager,是什么?如何配置?

A:

  • 是什么:通过ContentNegotiationManager,来确定请求每题类型的默认策略;
  • 三种配置ContentNegotiationManager的方法
    • 直接声明一个ContentNegotiationManager类型的bean;
    • 通过ContentNegotiationManagerFactoryBean间接创建bean;
    • 重载WebMvcConfigurerAdapter的configureContentNegotiation()方法。

235

Q: #16.2.2-1 | Spring提供了多个HTTP信息转换器,用于实现资源表述与各种Java类型之间的互相转换

A:

  • AtomFeedHttpMessageConverter --- Rome Feed对象和Atom feed(媒体类型application/atom+xml)之间的互相转换。如果 Rome 包在类路径下将会进行注册;
  • BufferedImageHttpMessageConverter --- BufferedImages与图片二进制数据之间互相转换;
  • ByteArrayHttpMessageConverter --- 读取/写入字节数组。从所有媒体类型(*/*)中读取,并以application/octet-stream格式写入;
  • FormHttpMessageConverter --- 将application/x-www-form-urlencoded内容读入到MultiValueMap<String,String>中,也会将MultiValueMap<String,String>写入到application/x-www-form- urlencoded中或将MultiValueMap<String, Object>写入到multipart/form-data中;
  • Jaxb2RootElementHttpMessageConverter --- 在XML(text/xml或application/xml)和使用JAXB2注解的对象间互相读取和写入。如果 JAXB v2 库在类路径下,将进行注册;
  • MappingJacksonHttpMessageConverter --- 在JSON和类型化的对象或非类型化的HashMap间互相读取和写入。如果 Jackson JSON 库在类路径下,将进行注册;
  • MappingJackson2HttpMessageConverter --- 在JSON和类型化的对象或非类型化的HashMap间互相读取和写入。如果 Jackson 2 JSON 库在类路径下,将进行注册;
  • MarshallingHttpMessageConverter --- 使用注入的编排器和解排器(marshaller和unmarshaller)来读入和写入XML。支持的编排器和解排器包括Castor、JAXB2、JIBX、XMLBeans以及Xstream;
  • ResourceHttpMessageConverter --- 读取或写入Resource;
  • RssChannelHttpMessageConverter --- 在RSS feed和Rome Channel对象间互相读取或写入。如果 Rome 库在类路径下,将进行注册;
  • SourceHttpMessageConverter --- 在XML和javax.xml.transform.Source对象间互相读取和写入;
  • 默认注册;
  • StringHttpMessageConverter --- 将所有媒体类型(*/*)读取为String。将String写入为text/plain;
  • XmlAwareFormHttpMessageConverter --- FormHttpMessageConverter的扩展,使用SourceHttp MessageConverter来支持基于XML的部分。

236

Q: #16.3.1-1 | spring如何处理“响应体中能够包含错误信息而不是空”的场景

A:

  • 使用@ResponseStatus注解可以指定状态码;
  • 控制器方法可以返回ResponseEntity对象,该对象能够包含更多响应相关的元数据;
  • 异常处理器能够应对错误场景,这样处理器方法就能关注于正常的状况。

237

Q: #16.4.1-2 | RestTemplate定义了11个独立的操作,其中的大多数操作都以三种方法的形式进行了重载:

A:

  • 一个使用java.net.URI作为URL格式,不支持参数化URL;
  • 一个使用String作为URL格式,并使用Map指明URL参数;
  • 一个使用String作为URL格式,并使用可变参数列表指明URL参数。

238

Q: #16.4.1-3 | RestTemplate定义了11个独立的操作,而每一个都有重载,这样一共是36个方法

A:

  • delete() --- 在特定的URL上对资源执行HTTP DELETE操作;
  • exchange() --- 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的;
  • execute() --- 在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象;
  • getForEntity() --- 发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象;
  • getForObject() --- 发送一个HTTP GET请求,返回的请求体将映射为一个对象;
  • headForHeaders() --- 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头;
  • optionsForAllow() --- 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息;
  • postForEntity() --- POST数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的;
  • postForLocation() --- POST数据到一个URL,返回新创建资源的URL;
  • postForObject() --- POST数据到一个URL,返回根据响应体匹配形成的对象;
  • put() --- PUT资源到特定的URL。

239

Q: #17.0-1 | 什么是异步消息?

A: 异步消息是一个应用程序向另一个应用程序间接发送消息的一种方式,这种方式无需等待对方的响应。

240

Q: #17.0-2 | 什么是MDB?

A: 与EJB的消息驱动Bean(message-driven bean,MDB)类似的消息接收方式。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 怀英的自我修炼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档