spring-boot - 如何使用响应式(Reactive)沙发底座获取对象的嵌套列表?

标签 spring-boot spring-data reactive-programming couchbase

我最近开始回顾/学习一些有关响应式(Reactive) couchbase 的内容,并且我正在尝试使用该技术与 spring 数据和 spring boot 来实现一个示例,我有以下模型:

@Document
public class Person {
    @Id
    private String id;
    @Field
    private String name;
    @Field
    private String lastName;
    @Field
    private List<Address> address;
    // Getters & Setters
}

@Document
public class Address {
    @Id
    private String code;
    @Field
    private String mainStreet;
    @Field
    private String secondStreet;
    // Getters & Setters
}

存储库:

@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "address")
public interface AddressRepository extends ReactiveCouchbaseRepository<Address, String> {
}

@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "person")
public interface PersonRepository extends ReactiveCouchbaseRepository<Person, String> {
}

服务:

public interface PersonService {
    Flux<Person> getAllPersons();
    Mono<Person> getPerson(String id);
    Flux<Address> getAddressesByPerson(String id);
}

@Service
public class PersonServiceImpl implements PersonService {
    @Autowired
    private PersonRepository personRepository;

    @Override
    public Flux<Person> getAllPersons() {
        return personRepository.findAll();
    }

    @Override
    public Mono<Person> getPerson(String id) {
        return personRepository.findById(id);
    }

    @Override
    public Flux<Address> getAddressesByPerson(String id) {
        return null;
    }
}

Controller :

@RestController
@RequestMapping("/sample_couchbase")
public class PersonController {
    @Autowired
    private PersonService personService;

    @GetMapping("/people")
    public Flux<Person> getAllPersons() {
        return personService.getAllPersons();
    }

    @GetMapping("/person/{id}")
    public Mono<ResponseEntity<Person>> getPersonsById(@PathVariable String id) {
        return personService.getPerson(id)
                            .map(person -> ResponseEntity.status(HttpStatus.OK).body(person))
                            .defaultIfEmpty(ResponseEntity.notFound().build());
    }
}

到目前为止,这效果很好,我可以检索所有人员,也可以按特定人员的 ID 进行过滤,另一方面,我想检索特定人员的所有地址列表,我的意思是我有这个couchbase 中的文档:

{
  "id": "1",
  "name": "Scooby",
  "lastName": "Doo",
  "address": [
    {
      "code": "A1",
      "mainStreet": "AAA",
      "secondStreet": "BBB",
      "phone": "11111",
      "place": "home"
    },
    {
      "code": "A2",
      "mainStreet": "CCC",
      "secondStreet": "DDD",
      "phone": "22222",
      "place": "work"
    },
    {
      "code": "A3",
      "mainStreet": "EEE",
      "secondStreet": "FFF",
      "phone": "33333",
      "place": "treasury"
    }
  ],
  "classType": "com.jcalvopinam.model.Person"
}

当我调用服务时,例如:http://localhost:8080/sample_couchbase/person/1/addresses 我想得到这个:

"address": [
    {
      "code": "A1",
      "mainStreet": "AAA",
      "secondStreet": "BBB",
      "phone": "11111",
      "place": "home"
    },
    {
      "code": "A2",
      "mainStreet": "CCC",
      "secondStreet": "DDD",
      "phone": "22222",
      "place": "work"
    },
    {
      "code": "A3",
      "mainStreet": "EEE",
      "secondStreet": "FFF",
      "phone": "33333",
      "place": "treasury"
    }
  ]

我想象在存储库中创建一个类似这样的方法:

Mono<Person> findById(String id);

在服务层中,我想象获取整个对象,然后按地址进行过滤,但这与我习惯做的不同,现在我使用 Mono 和 Flux,而不是简单的对象或列表,所以我不知道该怎么做,有人可以给我一个想法吗?或者有更好的解决方案吗?

最佳答案

我找到了一种检索特定人员地址的简单方法,我使用了一个查询来指定要检索的内容:

@Query("SELECT addresses, META(sample).id as _ID, META(sample).cas as _CAS FROM `sample` WHERE id = $1")
Flux<Person> findAddressesByPerson(String id);

我注意到有必要将META(sample).id指定为_IDMETA(sample).cas作为_CAS属性以避免以下错误:

org.springframework.data.couchbase.core.CouchbaseQueryExecutionException:无法检索足够的元数据以供 N1QL 到实体映射,您是否选择了 _ID 和 _CAS?;嵌套异常是 rx.exceptions.OnErrorThrowable$OnNextValue: OnError 同时发出 onNext 值: com.couchbase.client.java.query.DefaultAsyncN1qlQueryRow.class

如果您想更详细地了解实现,请参阅以下示例:https://github.com/juanca87/sample-couchbase-rx

关于spring-boot - 如何使用响应式(Reactive)沙发底座获取对象的嵌套列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52029747/

相关文章:

java - 使用 Spring 测试数据库

java - mongo模板findAndModify返回列表

spring-data - Spring Data Neo4j - ORDER BY {order} 失败

java - rxJava - Observable 如何从 .create 方法体中发出?

swift - 观察事件传递到 reactiveswift

java - 如何测试更新方法?

spring - 如何从 Spring Boot 中排除依赖项

java - Spring MVC 应用程序中的 CommandLineRunner 功能

java - Spring Boot 禁用/错误映射

objective-c - 合并两个 RACSignals,在第一次完成时完成