es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo llamo a una API utilizando (Spring) webClient con un DTO filtrado por @JsonView?

Me he sumergido en la documentación, pero solo encuentro referencias circulares a los aspectos mecánicos del uso de webClient, sin ejemplos concretos… Y nada que lo fusiona con el uso de @JsonView.

Tengo un microservicio que acepta un DTO del cliente, realiza una validación básica y luego lo quiere pasar a otro microservicio. Sin embargo, al pasarlo, quiero eliminar campos, según un JsonView.

DTO de Usuario Básico

@JsonView({Views.Incoming.class,Views.Internal.class})
private String email;
@JsonView({Views.Incoming.class,Views.Internal.class})
private String password;
@JsonView(Views.Incoming.class)
private String passwordCheck; // validado como coincidente en el primer servicio, no es necesario al pasar al siguiente.

¿Cómo puedo a) construir realmente un webClient, hacer una solicitud con él y devolver un resultado utilizable, y b) proporcionarle mi DTO filtrado por @JsonView(Views.Internal.class)?

(La documentación sobre webClient en sí es confusa, ya que sugiere que se necesita uno separado para cada solicitud (diferenciándolo de restTemplate), pero los ejemplos que he encontrado lo instancian como estático en la clase de servicio…)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para construir un webClient, puedes empezar creando un objeto Builder y luego configurándolo con las opciones necesarias. Aquí hay un ejemplo de fragmento de código:

    WebClient.Builder builder = WebClient.builder();
    WebClient webClient = builder.build();
    

    Para hacer una solicitud con este webClient, puedes usar el método get() para especificar la URL del punto final y luego retrieve() para realizar la solicitud real. Aquí hay un ejemplo:

    Mono<mydto> result = webClient.get()
        .uri("https://some.service.com/api/data")
        .retrieve()
        .bodyToMono(MyDto.class);
    

    Para aplicar @JsonView(Views.Internal.class) a tu DTO antes de enviarlo a otro microservicio, puedes usar ObjectMapper para generar una cadena de JSON filtrado y luego analizarla de nuevo en el DTO deseado. Aquí hay un ejemplo:

    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writerWithView(Views.Internal.class).writeValueAsString(dto);
    MyDto filteredDto = objectMapper.readerWithView(Views.Internal.class).forType(MyDto.class).readValue(json);
    

    Combinando estos dos fragmentos de código, puedes enviar una solicitud con un DTO filtrado usando webClient:

    WebClient.Builder builder = WebClient.builder();
    WebClient webClient = builder.build();
    
    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writerWithView(Views.Internal.class).writeValueAsString(dto);
    MyDto filteredDto = objectMapper.readerWithView(Views.Internal.class).forType(MyDto.class).readValue(json);
    
    Mono<mydto> result = webClient.post()
        .uri("https://another.service.com/api/data")
        .body(BodyInserters.fromValue(filteredDto))
        .retrieve()
        .bodyToMono(MyDto.class);
    
    return result.block();
    

    Ten en cuenta que el método block() al final se utiliza para esperar el resultado, lo cual puede no ser necesario en tu caso de uso específico. Además, ten en cuenta que esto es solo un ejemplo y puede haber otras configuraciones y opciones que necesites ajustar según tus necesidades específicas.

Comments are closed.