春季最高

通过参考资料,开始使用Spring 5和Spring Boot 2学习的春天课程:

> >学习春天
休息前

通过参考资料,开始使用Spring 5和Spring Boot 2学习的春天课程:

>>看看这个课程

1.概述

本文将展示如何在Spring中设置REST-控制器和HTTP响应代码,配置有效载荷编组和内容协商。

进一步阅读:

使用Spring @ResponseStatus设置HTTP状态码

看看@ResponseStatus注释以及如何使用它来设置响应状态代码。

Spring @Controller和@RestController注解

了解Spri金宝搏官网188beng MVC中@Controller和@RestController注解之间的区别。

2.在春天理解REST

Spring框架支持两种创建RESTful服务的方式:

  • 使用MVC和ModelAndView
  • 使用HTTP消息转换器

ModelAndView方法较旧,而且有更好的文档,但也更冗长,配置更繁重。它试图将REST范例硬塞到旧模型中,这并非没有问题。Spring团队理解了这一点,并从Spring 3.0开始提供了一流的REST支持。

新方法,基于HttpMessageConverter注释则更加轻量级,易于实现。配置是最少的,并且它为您期望从RESTful服务获得的内容提供了合理的缺省值。

3.Java配置

@Configuration @EnableWebMvc public class WebConfig{//}

@EnableWebMvc注释做了一些有用的事情——特别是,对于REST,它检测类路径上是否存在Jackson和JAXB 2,并自动创建和注册默认的JSON和XML转换器。注释的功能等同于XML版本:

< mvc:注解驱动/ >

这是一种快捷方式,尽管在许多情况下可能有用,但它并不完美。当需要更复杂的配置时,删除注释并进行扩展WebMvcConfigurationSupport直接。

3.1.使用Spring的引导

如果我们用@SpringBootApplication注释和spring-webmvc库在类路径上,然后@EnableWebMvc注释自动添加一个默认的自动配置

我们仍然可以通过实现WebMvcConfigurer界面上的@ configuration带注释的类。我们也可以用aWebMvcRegistrationsAdapter实例提供我们自己的RequestMappingHandlerMappingRequestMappingHandlerAdapter,或ExceptionHandlerExceptionResolver实现。

最后,如果我们想放弃Spring Boot的MVC特性并声明一个自定义配置,我们可以使用@EnableWebMvc注释。

4.测试Spring上下文

从Spring 3.1开始,我们得到了对@ configuration类:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {WebConfig.class, persistenceconfigure .class}, loader = AnnotationConfigContextLoader.class) public class SpringContextIntegrationTest {@Test public void contextLoads(){//当}}

类指定Java配置类@ContextConfiguration注释。新AnnotationConfigContextLoader控件加载bean定义@ configuration类。

请注意,WebConfig配置类没有包含在测试中,因为它需要在Servlet上下文中运行,而没有提供这个上下文中。

4.1.使用Spring的引导

Spring Boot提供了几个注解来设置SpringApplicationContext为我们的测试提供了更直观的方式。

我们可以只加载应用程序配置的一个特定片段,或者我们可以模拟整个上下文启动过程。

例如,我们可以使用@SpringBootTest注释,如果我们想在不启动服务器的情况下创建整个上下文。

有了这些,我们就可以添加@AutoConfigureMockMvc注入一个MockMvc实例并发送HTTP请求

@RunWith(springgrunner .class) @SpringBootTest @AutoConfigureMockMvc public class FooControllerAppIntegrationTest {@Autowired private MockMvc MockMvc;@Test public void whenTestApp_thenEmptyResponse()抛出异常{this.mockMvc.perform(get("/foo ") .andExpect(status().isOk()) .andExpect(…);} }

为了避免创建整个上下文和只测试我们的MVC控制器,我们可以使用@WebMvcTest:

@RunWith(SpringRunner.class) @WebMvcTest(FooController.class) public class FooControllerWebLayerIntegrationTest {@Autowired private MockMvc MockMvc;@MockBean私有IFooService服务;@Test() public void whenTestMvcController_thenRetrieveExpectedResult() throws Exception{//…this.mockMvc.perform (get (" / foo ") .andExpect(…);} }

我们可以找到关于这个主题的详细信息我们的“Spring Boot中的测试”文章

5.控制器

@RestController是RESTful API的整个Web层的核心构件。为了这篇文章的目的,控制器正在建模一个简单的REST资源-喷火

@RestController @RequestMapping("/foo ")类FooController {@Autowired私有IFooService服务;@GetMapping public List findAll() {return service.findAll();} @GetMapping(value = "/{id}") public Foo findById(@PathVariable("id") Long id) {return restpreconditionescheckfound (service.findById(id));} @PostMapping @ResponseStatus(HttpStatus.CREATED) public Long create(@RequestBody Foo resource) {precondition . checknotnull (resource);返回service.create(资源);} @PutMapping(value = "/{id}") @ResponseStatus(HttpStatus.OK) public void update(@PathVariable("id") Long id, @RequestBody Foo resource) {precondition . checknotnull (resource);RestPreconditions.checkNotNull (service.getById (resource.getId ()));service.update(资源);} @DeleteMapping(value = "/{id}") @ResponseStatus(HttpStatus.OK) public void delete(@PathVariable("id") Long id) {service.deleteById(id);} }

你可能已经注意到我用的是一种简单的番石榴风格RestPreconditions用途:

public class RestPreconditions {public static  T checkFound(T resource) {if (resource == null){抛出新的MyResourceNotFoundException();}返回资源;} }

Controller实现是非公有的——这是因为它不需要是公有的。

通常,控制器是依赖链中的最后一个。它接收来自Spring前端控制器的HTTP请求DispatcherServlet),并简单地将它们转发给服务层。如果不存在必须通过直接引用注入或操纵控制器的用例,那么我宁愿不将其声明为public。

请求映射很简单。与任何控制器一样,实际的价值的映射以及HTTP方法确定请求的目标方法。RequestBody将方法的参数绑定到HTTP请求的主体,而@ResponseBody对响应和返回类型执行相同的操作。

@RestController是一个速记要同时包含@ResponseBody@ controller我们课上的注释

它们还确保使用正确的HTTP转换器对资源进行编组和解组。将进行内容协商,以选择将使用哪个活动转换器,主要基于接受头,尽管其他HTTP头也可以用来确定表示。

6.映射HTTP响应码

HTTP响应的状态代码是REST服务中最重要的部分之一,这个主题很快就会变得非常复杂。这些问题的正确与否决定了这项服务的成败。

6.1。地图上未标明的请求

如果Spring MVC收到一个没有映射的请求,它会认为这个请求不被允许,并返回405 METHOD not allowed给客户端。

包含允许返回405到客户端,以指定允许哪些操作。这是Spring MVC的标准行为,不需要任何额外的配置。

6.2。有效的映射请求

对于任何有映射的请求,如果没有指定其他状态代码,Spring MVC会认为该请求是有效的,并以200 OK作为响应。

因为这个,控制器声明不同@ResponseStatus创建更新删除行动,但不是为了得到,它确实应该返回默认的200 OK。

6.3。客户端错误

在客户端错误的情况下,定义自定义异常并映射到适当的错误代码。

简单地从web层的任何层抛出这些异常将确保Spring在HTTP响应上映射相应的状态代码:

@ResponseStatus(HttpStatus.NOT_FOUND) public class ResourceNotFoundException extends RuntimeException {//

这些异常是REST API的一部分,因此,应该只在相应的REST层中使用;例如,如果存在DAO/DAL层,它不应该直接使用异常。

还要注意,这些不是受控异常,而是运行时异常——符合Spring实践和习惯用法。

6.4。使用@ExceptionHandler

将自定义异常映射到特定状态代码的另一个选项是使用@ExceptionHandler控制器中的注释。这种方法的问题是,注释只适用于定义它的控制器。这意味着我们需要在每个控制器中分别声明。

当然,还有更多处理错误的方法在Spring和Spring Boot提供更多的灵活性。

7.额外的Maven的依赖关系

除了spring-webmvc依赖标准web应用程序所需,我们需要为REST API设置内容编组和反编组:

<依赖> <依赖> < groupId > com.fasterxml.jackson。 2.9.8    jaxb-api 2.3.1 runtime  

这些库用于将REST资源的表示转换为JSON或XML。

7.1.使用Spring的引导

如果我们想检索json格式的资源,Spring Boot提供了对不同库的支持,即Jackson、Gson和JSON-B。

自动配置是通过在类路径中包含任何映射库来实现的。

通常,如果我们在开发一个网络应用程序,我们只要加上spring-boot-starter-web依赖它来包含所有必要的工件到我们的项目中

<依赖> < groupId > org.springframework。 2.4.0  . jpg (72.62 kb,下载时间:0

Spring Boot默认使用Jackson。

如果我们想以XML格式序列化资源,就必须添加Jackson XML扩展(jackson-dataformat-xml),或通过使用@XmlRootElement我们资源上的注释。

8.结论

本教程说明了如何使用Spring和基于java的配置实现和配置REST服务。

在本系列的下一篇文章中,我将重点介绍API的可发现性,高级内容协商和与附加表示的工作资源。

本文的所有代码都是可用的在Github.这是一个基于maven的项目,因此它应该很容易导入和运行。

春天底

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

> >这门课程
休息下

开始使用Spring 5和Spring Boot 2,通过学习的春天课程:

>>看看这个课程
2评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!