spring - HATEOAS 关于 Spring Flux/Mono 响应

标签 spring spring-mvc spring-hateoas spring-webflux

我一直在遵循以下准则使用 Spring HATEOAS:

https://spring.io/guides/gs/rest-hateoas/#initial

package hello;

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@RestController
public class GreetingController {

    private static final String TEMPLATE = "Hello, %s!";

    @RequestMapping("/greeting")
    public HttpEntity<Greeting> greeting(@RequestParam(value = "name", required = false, defaultValue = "World") String name) {

        Greeting greeting = new Greeting(String.format(TEMPLATE, name));
        greeting.add(linkTo(methodOn(GreetingController.class).greeting(name)).withSelfRel());

        return new ResponseEntity<Greeting>(greeting, HttpStatus.OK);
    }
}

现在我想使用存储库并输出 Flux/Mono 响应:
@RestController
class PersonController {

    private final PersonRepository people;

    public PersonController(PersonRepository people) {
        this.people = people;
    }

    @GetMapping("/people")
    Flux<String> namesByLastname(@RequestParam Mono<String> lastname) {

        Flux<Person> result = repository.findByLastname(lastname);
        return result.map(it -> it.getFullName());
    }
}

如何在 Flux/Mono 响应上使用 Spring HATEOAS?有可能吗?

最佳答案

更新 因为支持在 Spring Web Flux 中使用 HATEOAS。

public class Person extends ResourceSupport
{
    public Person(Long uid, String name, String age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }

    private Long uid;
    private String name;
    private String age;

    public Long getUid() {
        return uid;
    }

    public void setUid(Long uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

在 Controller 中使用上述 Person 如下
@GetMapping("/all")
    public Flux getAllPerson() {
        Flux<List<Person>> data = Flux.just(persons);
        return data.map(x ->  mapPersonsRes(x));
    }

    private List<Resource<Person>> mapPersonsRes(List<Person> persons) {
    List<Resource<Person>> resources = persons.stream()
            .map(x -> new Resource<>(x,
                    linkTo(methodOn(PersonController.class).getPerson(x.getUid())).withSelfRel(),
                    linkTo(methodOn(PersonController.class).getAllPerson()).withRel("person")))
            .collect(Collectors.toList());
    return resources;
}

或者如果你想要一个人,你也可以使用 Mono
@GetMapping("/{id}")
public Mono<Resource<Person>> getPerson(@PathVariable("id") Long id){
    Mono<Person> data = Mono.justOrEmpty(persons.stream().filter(x -> x.getUid().equals(id)).findFirst());
    Mono person = data.map(x -> {
        x.add(linkTo(methodOn(PersonController.class).getPerson(id)).withSelfRel());
        return x;
    });
    return person;
}

这是 .map 的简单使用Flux/Mono 提供的函数。
我希望这对以后的观众有所帮助。

关于spring - HATEOAS 关于 Spring Flux/Mono 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650753/

相关文章:

javax.faces.FacesException 。它是属于 Spring Security 3.x 的一个异常(exception)

Java 类设计 - 最佳方法的建议。类扩展抽象类并实现接口(interface)

java - 将 li 列表从客户端传递到 Spring MVC Controller

java - Spring Data REST - 通过使用实体列表无法识别字段 "_embedded",Java HATEOAS

java - Spring JDBCTemplate 给出 InvalidResultSetAccessException Invalid column index

Java.net.连接异常 : Connection refused while building Ant

spring - IBM MQueue : setdirectAuth() operation is invalid error

java - 定期重新创建对象

java - spring-data-rest:是否可以在单个响应中动态嵌入资源的关系?

java - 调用 Spring Data Rest Repository 方法不返回链接