Rest Api с разным откликом на успех и провал - PullRequest
0 голосов
/ 09 мая 2018

Я использую очень старый сторонний API в своем коде, который возвращает разные ответы в случае успеха и неудачи, например

для успеха

 SuccessResObj{
     a{...
        b{...
           c{...}
         }
      }
    }

Actual SuccessResObj имеет около 10-15 вложенных объектов.

для отказа

    FailureResObj{
     status="failure because of ...";
     code="400"; // code will always be 400 in case of failure, irrespective of reason of failure
    }

FailureResObj имеет только 2 переменные.

Я знаю, что это неправильно, но сторонний API не собирается менять там ответ, мне нужно сделать обходной путь в моем коде, как мне его обработать, потому что мне нужно зарегистрировать оба сценария в базе данных.

Редактировать

я пытался создать WrapperBean

WrapperBean{
 SuccessResObj;
 FailureResObj;
}

WrapperBean = ApiResonse ();

затем его ClassCastExcaption, потому что ответом является только 1 тип объекта, и я пытаюсь сопоставить его с WrapperBean, который имеет 2 объекта.

Пример кода передачи для такого рода ответа будет принят.

его можно просто представить как метод, произвольно возвращающий 2 разных типа ответа. как это должно быть обработано.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы можете использовать Джексона для преобразования результата в строку json.

из базы подписки:

static class C {
    String val;

    public String getVal() {
        return val;
    }

    public void setVal(String val) {
        this.val = val;
    }
}
static class B {
    private C c;

    public C getC() {
        return c;
    }

    public void setC(C c) {
        this.c = c;
    }
}
static class A {
    private B b;

    public B getB() {
        return b;
    }

    public void setB(B b) {
        this.b = b;
    }
}

static class SuccessResObj {
    private A a;

    public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }
}

static class FailureResObj{
    private String status;
    private String code;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}

public static void main(String[] args) throws JsonProcessingException {
    A a = new A();
    B b = new B();
    C c = new C();
    c.setVal("Hello World.");
    b.setC(c);
    a.setB(b);
    SuccessResObj successResObj = new SuccessResObj();
    successResObj.setA(a);
    FailureResObj failureResObj = new FailureResObj();
    failureResObj.setCode("400");
    failureResObj.setStatus("failure because of ...");
    ObjectMapper mapper = new ObjectMapper();
    String json = mapper.writeValueAsString(successResObj);
    System.out.println(json);
    json = mapper.writeValueAsString(failureResObj);
    System.out.println(json);
}

Выход:

{"a":{"b":{"c":{"val":"Hello World."}}}}
{"status":"failure because of ...","code":"400"}

Затем зарегистрируйте строку json в своей базе данных:)

0 голосов
/ 09 мая 2018

Поскольку вы используете RestTemplate, RestTemplate выдаст HttpClientErrorException в случае отсутствия статуса HTTP 200.

Вот пример кода:

try {
    String successResponse = restTemplate.exchange(uri, httpMethod, httpEntity, String.class);
    // convert String in to Object using object mapper
} catch (HttpClientErrorException e) {
    if (e.getStatusCode().value() == 400) {
        String errorResponse = e.getResponseBodyAsString();
        // convert String in to Object using object mapper
        }
    }
}

Подробнее о ObjectMapper просмотреть это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...