【问题标题】:How to map errorType using Micronaut client annotation如何使用 Micronaut 客户端注释映射 errorType
【发布时间】:2019-09-16 12:52:43
【问题描述】:

如何使用 Micronaut 客户端注解映射 errorType,如果以编程方式,我们可以在成功和失败的情况下提供主体类型和 errorType 对象。

以编程方式调用客户端:

import io.micronaut.core.type.Argument;
import io.micronaut.http.HttpRequest;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.MediaType;
import io.micronaut.http.client.DefaultHttpClient;
import io.micronaut.http.client.exceptions.HttpClientResponseException;
import io.micronaut.http.uri.UriBuilder;
import io.reactivex.Single;
import java.net.URL;

@Singleton
public class Test{
    public User getUser(String id) {
        try {
            String uriPath = UriBuilder.of("url")
                            .queryParam("id", id)
                            .toString();

        DefaultHttpClient httpClient = new DefaultHttpClient(new URL(""),httpClientConfiguration);

        Single<HttpResponse<User>> single = Single.fromPublisher(httpClient.exchange(
        HttpRequest.GET(uriPath).header(X_REQUEST_ID, REQUEST_ID).accept(MediaType.APPLICATION_JSON_TYPE),
        Argument.of(User.class), //bodyType
        Argument.of(Object.class) //errorType
        ));

        HttpResponse<User> response = single.blockingGet();
        User user = response.body();
        return user;            
        } catch (HttpClientResponseException | Exception e ) {              
        } 
    }
}

使用注解调用客户端

import io.micronaut.http.HttpResponse;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Consumes;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Header;
import io.micronaut.http.client.annotation.Client;
import io.reactivex.Single;
@Client(value = "url",
path = "/user")
public interface TestClient {
    @Get("?id=123")
    @Consumes(MediaType.APPLICATION_JSON)
        Single<HttpResponse<User>> getUser();
   }

【问题讨论】:

    标签: java annotations micronaut micronaut-client


    【解决方案1】:

    如果你想定义自己的自定义对象为errorType,你可以在micronaut中使用声明式客户端时声明如下:

    @Client(id="",//The ID of the client
                value = "url", //The URL or service ID of the remote service
                path = "/user",//The base URI for the client. Only to be used in conjunction with id().
                errorType=YourCustomObject.class,//The type used to decode errors
                configuration=<? extends HttpClientConfiguration>//The http client configuration bean to use
                )
    public interface ExternalCallClient{
        //some API method
    }
    

    然后在您的连接器客户端类:

    class Connect{
    
    @Inject
    private ExternalCallClient externalCallClient;
    
    call(){
    
        try{
            //call to external API method using externalCallClient
          }catch(HttpClientResponseException e){
    
             Optional<YourCustomObject> error = e.getResponse()
                                                 .getBody(YourCustomObject.class)
                }
            }
        }
    

    如果底层客户端出现异常,Micronaut 客户端会为 HTTP 代码(400 及以上 400(404 除外))抛出 HttpClientResponseException。 因此,如果底层客户端在异常情况下提供了一个自定义错误对象作为响应主体,则此自定义错误类型可用于优雅的错误处理和日志记录。

    DefaultHttpClient 也可以使用类似的方法。

    【讨论】:

      【解决方案2】:

      根据 Micronaut API 文档,@Client 注释中的 errorType 可用,它可以帮助我处理 errorType 响应。

      https://docs.micronaut.io/latest/api/index.html https://docs.micronaut.io/latest/guide/index.html#clientAnnotation

      @Client(id="",//The ID of the client
              value = "url", //The URL or service ID of the remote service
              path = "/user",//The base URI for the client. Only to be used in conjunction with id().
              errorType=Object.class,//The type used to decode errors
              configuration=<? extends HttpClientConfiguration>//The http client configuration bean to use
              )
      @Header(name="", value="")      
      public interface TestClient {
          @Get("?id=123")
          @Consumes(MediaType.APPLICATION_JSON)
          @Produces(MediaType.APPLICATION_JSON)
          Single<HttpResponse<User>> getUser();
         }
      

      【讨论】:

        猜你喜欢
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        相关资源
        最近更新 更多