Объект от объекта к объекту передачи данных (DTO) в Spring React - PullRequest
0 голосов
/ 06 июля 2018

У меня есть модель заказа

@Document(collection="order")
public class Order {
  @Id
  String id;

  String desc;

  String orgId;
}

И каждый OrgId связан с объектом организации

@Document(collection="organization")
public class Organization {

    @Id
    String id;

    String desc;

    String ownerEmail;
}

Мой DTO для заказа

public class OrderDTO {

    String id;

    String desc;

    Organization org;

}

Я хотел вернуть Flux и Mono для OrderDTO весной.

@RestController
@RequestMapping("orders")
public class OrderController {

    @Autowired
  private OrderService service;

    @Autowired
  private OrganizationService orgService;

    @GetMapping
    public Flux<OrderDTO> findAll() {
        return service.findAll(); // wanted step for Flux<Order> to Flux<OrderDTO>
    }

    @GetMapping("/{id}")
    public Mono<OrderDTO> findOne(@PathVariable String id) {
        return service.findOne(id); // wanted step for Mono<Order> to Mono<OrderDTO>
    }

}

1 Ответ

0 голосов
/ 07 июля 2018

Прежде всего попытайтесь разобраться в своих мыслях и шагах.

  1. Создание моделей Order & Organization
  2. Создание репозитория для каждой модели в соответствии с реализацией БД , Создайте OrderRepository & OrganizationRepository extends для ReactiveMongoRepository или ReactiveCrudRepository

    import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public interface OrderRepository extends ReactiveMongoRepository<Order, String> {
       // Spring Boot automatically add  an implementation of this interface called SimpleOrderRepository at runtime.
    
      // So you get all the CRUD methods on the Document readily available to you without needing to write any code. Following are some of the methods available from SimpleReactiveMongoRepository -
    
      // reactor.core.publisher.Flux<T>  findAll(); 
      // reactor.core.publisher.Mono<T>  findById(ID id); 
      // <S extends T> reactor.core.publisher.Mono<S>  save(S entity); 
      // reactor.core.publisher.Mono<Void>   delete(T entity);
    
      // Notice that all the methods are asynchronous and return a publisher in the form of a Flux or a Mono type.
    }
    
    @Repository
    public interface OrganizationRepository extends ReactiveMongoRepository<Organization, String> {
    
    }
    
  3. Создание конечных точек контроллера

    @RestController
    @RequestMapping("orders")
    public class OrderController {
    
    @Autowired
    private OrderRepository orderRepository;
    
    @GetMapping
    public Flux<Order> getAllOrders() {
        return orderRepository.findAll();
    }
    
    @PostMapping
    public Mono<Tweet> createOrder(@Valid @RequestBody Order order) {
        return orderRepository.save(order);
    }
    
    @GetMapping("{id}")
    public Mono<ResponseEntity<Order>> getOrderById(@PathVariable(value = "id") String orderId) {
        return orderRepository.findById(orderId)
                .map(savedOrder -> ResponseEntity.ok(savedOrder))
                .defaultIfEmpty(ResponseEntity.notFound().build());
    }
    
    @PutMapping("{id}")
    public Mono<ResponseEntity<Order>> updateTweet(@PathVariable(value = "id") String orderId,
                                                   @Valid @RequestBody Order order) {
        return orderRepository.findById(orderId)
                .flatMap(existingOrder -> {
                    existingOrder.setDesc(order.getDesc());
                    return orderRepository.save(existingOrder);
                })
                .map(updatedOrder -> new ResponseEntity<>(updatedOrder, HttpStatus.OK))
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }
    
    @DeleteMapping("{id}")
    public Mono<ResponseEntity<Void>> deleteOrder(@PathVariable(value = "id") String orderId) {
    
        return orderRepository.findById(orderId)
                .flatMap(existingOrder ->
                        orderRepository.delete(existingOrder)
                            .then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK)))
                )
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }
    
    // Orders are Sent to the client as Server Sent Events
    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<Order> streamAllOrders() {
        return orderRepository.findAll();
    }
    }
    

Проверьте пример && doc для более подробного объяснения.

...