SpringMVC的函数式编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28089993/article/details/89366521

SpringMVC的函数式编程

    Spring 5.0开始拥抱响应式ReactiveStreams特性,并介绍一种新的响应式Reactive技术栈来替代传统的Servlet技术栈.而且它还为开发者提供了函数时编程模型,但是这种编程模型只针对Reactive技术栈提供.

    下面说个好消息,在即将到来的Spring5.2中,类似于APIs式的函数式编程将移植到Servlet技术栈,对于坚持使用Servlet技术栈但是想体验函数式编程的开发人员,这绝对是一个好消息,哈哈.

    这篇文章我们将简单的玩一玩Spring MVC中的这个新特性,每天大家工作肯定很辛苦,但是这个新特性值得大家拥有,大家加油哈.不说废话直接代码.

    使用Spring initializr创建一个Spring Boot项目, 选择 Web, JPA, Lombok, H2 依赖.

    注意: 为了获取Spring 5.2.0.M1在Spring Boot版本下拉框中请选择 2.2.0.M2 .各位小伙伴也可以等release版本出来,哈哈.

创建一个实体类Post.

@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Post {

    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;
    private String title;
    private String content;

}

创建一个依赖PostRepository

public interface PostRepository extends JpaRepository<Post, Long> {}

定义一个RouterFuncation实例处理路由规则

@Configuration
public class FnMvcConfig {

    @Bean
    public RouterFunction<ServerResponse> routes(PostHandler postHandler) {
        return route(GET("/posts"), postHandler::all)
                .andRoute(POST("/posts"), postHandler::create)
                .andRoute(GET("/posts/{id}"), postHandler::get)
                .andRoute(PUT("/posts/{id}"), postHandler::update)
                .andRoute(DELETE("/posts/{id}"), postHandler::delete);
    }
}

这个代码和之前的Reactive技术栈的代码几乎相同的,但是需要注意的是ServerRequest, ServerResponse 和 RouterFunction是从新的package包org.springframework.web.servlet.function引入的.

PostHandler处理的细节

@Component
public class PostHandler {

    private final PostRepository posts;

    public PostHandler(PostRepository posts) {
        this.posts = posts;
    }

    public ServerResponse all(ServerRequest req) {
        return ServerResponse.ok().body(this.posts.findAll());
    }

    public ServerResponse create(ServerRequest req) throws ServletException, IOException {

        var saved = this.posts.save(req.body(Post.class));
        return ServerResponse.created(URI.create("/posts/" + saved.getId())).build();
    }

    public ServerResponse get(ServerRequest req) {
        return this.posts.findById(Long.valueOf(req.pathVariable("id")))
            .map(post -> ServerResponse.ok().body(post))
            .orElse(ServerResponse.notFound().build());
    }

    public ServerResponse update(ServerRequest req) throws ServletException, IOException {
        var data = req.body(Post.class);

        return this.posts.findById(Long.valueOf(req.pathVariable("id")))
            .map(
                post -> {
                    post.setTitle(data.getTitle());
                    post.setContent(data.getContent());
                    return post;
                }
            )
            .map(post -> this.posts.save(post))
            .map(post -> ServerResponse.noContent().build())
            .orElse(ServerResponse.notFound().build());

    }

    public ServerResponse delete(ServerRequest req) {
        return this.posts.findById(Long.valueOf(req.pathVariable("id")))
            .map(
                post -> {
                    this.posts.delete(post);
                    return ServerResponse.noContent().build();
                }
            )
            .orElse(ServerResponse.notFound().build());
    }

}

    这和Reactive技术栈很相似,但是注意方法的返回值不是Mono而是ServerResponse.

    先简单介绍到这里,本文代码点击我.996是996,奋斗是奋斗,不应该划等号,希望大家做一个幸福的人儿.

猜你喜欢

转载自blog.csdn.net/qq_28089993/article/details/89366521