我最近开始回顾/学习一些关于反应性Couchbase,我试图实现一个使用Spring数据和Spring启动技术的示例,我有以下模型:
@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;
}
}
控制器:
@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(示例)。id为_id
和META(示例)。cas as _cas
属性以避免以下错误:
org。springframework。数据沙发床。果心CouchbaseQueryExecutionException:无法为N1QL到实体的映射检索足够的元数据,是否选择了_ID和_CAS?;嵌套异常是rx。例外情况。OnErrorThrowable$OnNextValue:OnError在发出onNext-value:com时。沙发床。客户JAVA查询DefaultAsyncN1qlQueryRow。类别
如果您想更详细地查看实现,以下是示例:https://github.com/juanca87/sample-couchbase-rx
问题内容: 我试图映射对象数组,每个数组包含另一个嵌套的对象数组。但是,该映射不适用于嵌套数组。我如何在嵌套数组的内容上进行映射,同时使所有的父对象保持相同? 小提琴: https : //jsfiddle.net/69z2wepo/249197/ 数据结构如下: 地图看起来像 问题答案: 由于每个元素都有一个数组,因此您也必须结束。 例
但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?
我试图在React中创建一个状态对象。我要求我们的状态实际上是一个由setState更新的字段 代码应为: 我应该如何将相同的对象设置为嵌套对象?
问题内容: 我从看起来像这样的API获取JSON: 我尝试了几种方法来在c#对象中表示此JSON(太多内容无法在此处列出)。我已经尝试过使用列表和字典,这是我尝试表示它的最新示例: 这是我用来反序列化JSON的方法: 包含和。并且包含,但是是。因此,除了反序列化之外,什么都没有。 它应该很简单,但是由于某种原因我无法弄清楚正确的对象表示形式 问题答案: 要使用,即: 假设项目名称和随响应而变化,并
我正在尝试映射这个JSON 我自己创建的java对象 我得到的错误是: 通用域名格式。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法反序列化