Spring boot 解析json类型的请求体时出现问题,该请求体包含一个字符串列表,以转换Spring中的字符串流量

Spring boot 解析json类型的请求体时出现问题,该请求体包含一个字符串列表,以转换Spring中的字符串流量,spring-boot,jackson,spring-webflux,reactive-mongo-java,Spring Boot,Jackson,Spring Webflux,Reactive Mongo Java,我的DTO如下所示: import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import reactor.core.publisher.Flux; @Data @NoArgsConstructor @AllArgsConstructor public class InternetPackageDto { private String id; private

我的DTO如下所示:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import reactor.core.publisher.Flux;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class InternetPackageDto {
    private String id;

    private String name;

    private String termsAndConditions;

    private String price;

    private Flux<String> packageAttributes;

    private Flux<String> extras;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import reactor.core.publisher.Flux;

@Document("internet_packages")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class InternetPackage {
    @Id
    private String id;

    private String name;

    private String termsAndConditions;

    private String price;

    private Flux<StoreableAttribute> attributes;

    private Flux<StoreableAttribute> extras;
}
 public InternetPackage fromDto(InternetPackageDto dto) {
        var internetPackage = new InternetPackage();

        internetPackage.setName(dto.getName());
        internetPackage.setPrice(dto.getPrice());
        internetPackage.setId(dto.getId());
        internetPackage.setExtras(this.resolePackageExtras(dto));
        internetPackage.setAttributes(this.resolePackageAttributes(dto));

        return internetPackage;
    }

  private Flux<StoreableAttribute> resolePackageExtras(InternetPackageDto dto) {
        return this.storeableAttributeService.resolveAttributes(dto.getExtras());
    }
    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes =  MediaType.APPLICATION_JSON_VALUE)
    public Mono<InternetPackageDto> update(@RequestBody InternetPackageDto incomingPackageDto) {
        return this.packageService
                .updatePackage(this.dtoMapper.fromDto(incomingPackageDto))
                .map(this.dtoMapper::toDto);
    }
在数据对象上,字段:
Flux attributes
Flux extras
存储在包对象旁边的单独集合中。并由映射器进行如下处理:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import reactor.core.publisher.Flux;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class InternetPackageDto {
    private String id;

    private String name;

    private String termsAndConditions;

    private String price;

    private Flux<String> packageAttributes;

    private Flux<String> extras;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import reactor.core.publisher.Flux;

@Document("internet_packages")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class InternetPackage {
    @Id
    private String id;

    private String name;

    private String termsAndConditions;

    private String price;

    private Flux<StoreableAttribute> attributes;

    private Flux<StoreableAttribute> extras;
}
 public InternetPackage fromDto(InternetPackageDto dto) {
        var internetPackage = new InternetPackage();

        internetPackage.setName(dto.getName());
        internetPackage.setPrice(dto.getPrice());
        internetPackage.setId(dto.getId());
        internetPackage.setExtras(this.resolePackageExtras(dto));
        internetPackage.setAttributes(this.resolePackageAttributes(dto));

        return internetPackage;
    }

  private Flux<StoreableAttribute> resolePackageExtras(InternetPackageDto dto) {
        return this.storeableAttributeService.resolveAttributes(dto.getExtras());
    }
    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes =  MediaType.APPLICATION_JSON_VALUE)
    public Mono<InternetPackageDto> update(@RequestBody InternetPackageDto incomingPackageDto) {
        return this.packageService
                .updatePackage(this.dtoMapper.fromDto(incomingPackageDto))
                .map(this.dtoMapper::toDto);
    }
更多信息:

  • 我使用类
    InternetPackageDto
    作为请求对象和响应对象
  • 我使用的是
    Flux
    而不是
    List
    ,因为我不确定对List执行阻塞解析是否是个好主意
  • 这些属性分别存储和管理
  • 以及在更新或插入该软件包期间;如果包含新的额外或属性,则db中的attributes集合将随着新传入的额外或属性的插入而更新
  • 看起来我可能犯了一个愚蠢的错误,因为我找不到关于这个问题的很多信息,或者我完全错了


    任何帮助都将不胜感激。

    我认为你应该这样做

    public Mono<InternetPackageDto> toDto(InternetPackage entity) {
        var internetPackage = new InternetPackageDto();
    
        internetPackage.setName(entity.getName());
        internetPackage.setPrice(entity.getPrice());
        internetPackage.setId(entity.getId());
    
    
        return Mono.zip(Mono.just(internetPackage), entity.getExtras().collectList(), entity.getAttributes().collectList())
                .flatMap(tu->{
                    var dto = tu.getT1();
                    dto.setExtras(tu.getT2()); //To make it work in my local i made entity.getAttributes() as Flux<String> so here you will probably need to use .stream().map(dbItem->dbItem.getPropertyName())
                    dto.setPackageAttributes(tu.getT2());
                    return Mono.just(dto);
                });
    }
    
    public-Mono-toDto(InternetPackage实体){
    var internetPackage=new InternetPackageDto();
    setName(entity.getName());
    setPrice(entity.getPrice());
    setId(entity.getId());
    返回Mono.zip(Mono.just(internetPackage)、entity.getExtras().collectList()、entity.getAttributes().collectList())
    .flatMap(图->{
    var dto=tu.getT1();
    dto.setExtras(tu.getT2());//为了使它在本地运行,我将entity.getAttributes()作为通量,所以这里可能需要使用.stream().map(dbItem->dbItem.getPropertyName())
    dto.setPackageAttribute(tu.getT2());
    返回Mono.just(dto);
    });
    }
    
    据我所知,Jackson说“我无法序列化Flux.class”。这是因为流量不是一个数据结构,它是一个无限的流。InternetPackage是否存储在mongo中?您能给我指一下图书馆的文档吗?它说您需要在属性中定义流量?是的
    InternetPackage
    存储在数据库中。我不确定我是否能找到那种文件。我在这里做的是尝试将
    InternetPackage
    存储在数据库中,并将从接收到的
    internetpackagedt传入的属性和附加项(存储在另一个数据库集合中)更新到
    。因此,请存储软件包,如果软件包中有任何附加项和属性尚未存储,请也存储它们(在一个单独的集合到软件包集合中)。好的,然后让我尝试更新我的答案。您有机会尝试吗?谢谢。但是文件
    packageAttributes
    extra
    存储在数据库中,因为它们也可以独立管理。因此,每次添加一个包时,映射器都会查看所提到的字段是否已存储在db中,如果尚未存储在db中,则会插入它们。将解析程序更改为与列表一起使用的方式如下:
    this.storeableAttributeService.resolveAttributes(Flux.fromIterable(dto.getExtras()).collectList().block()我希望避免此阻塞调用。@zambliner立即检查