невозможно перенаправить ответ в контроллер покоя - PullRequest
0 голосов
/ 06 февраля 2020

Я сделал два RestController API. При ответе на второй API я хотел получить ответ первого API (который является json ответом), поэтому я попытался использовать HttpServletResponse.redirect. Я также установил обязательное значение content type. Но при втором ответе API я получил Unsupported Media Type Content type 'null' not supported.

первый API

@GetMapping(value="checkStatus/{msisdn}",consumes=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<CoreResponseHandler> fetchOcsByDate2(@PathVariable(value="msisdn",required=true)String msisdn){
        long l_time_start = System.currentTimeMillis();
        List<Object[]> list = repository.getSingleCallDetail(msisdn);
        if(list==null || list.size()==0) {
            System.out.println("NO RECORD FOUND");
        }
        JSONObject objMain = new JSONObject();
        for(Object[] objArr: list) {
            JSONObject obj = new JSONObject();
            String msisdn_ = objArr[0]==null?null:objArr[0].toString();
            String songId = objArr[1]==null?null:objArr[1].toString();
            String songName = objArr[2]==null?null:objArr[2].toString();
            String status = objArr[3]==null?null:objArr[3].toString();
            String lang = objArr[4]==null?null:objArr[4].toString();
            String startDate = objArr[5]==null?null:objArr[5].toString();
            objMain.put("status", status);
            objMain.put("language", lang);

            obj.put("id", songId);
            obj.put("msisdn", msisdn);
            obj.put("songName", songName);
            objMain.put("subscription", obj);
        }
        long l_time_end = System.currentTimeMillis();
        long l_diff = l_time_end-l_time_start;
        if(list!=null && list.size()>0) {
            return new  ResponseEntity<CoreResponseHandler>(new SuccessResponseBeanRefined(HttpStatus.OK, ResponseStatusEnum.SUCCESSFUL, ApplicationResponse.SUCCESSFUL, objMain,l_diff+" ms"),HttpStatus.OK);
        }
        if(list==null || list.size()==0) {
            return new  ResponseEntity<CoreResponseHandler>(new SuccessResponseBeanRefined(HttpStatus.NOT_FOUND, ResponseStatusEnum.FAILED, ApplicationResponse.Failed, "not found",l_diff+" ms"),HttpStatus.NOT_FOUND);            
        }
        return  new ResponseEntity<CoreResponseHandler>(new SuccessResponseBeanRefined(HttpStatus.BAD_REQUEST, ResponseStatusEnum.FAILED, ApplicationResponse.Failed," > Bad request",l_diff+" ms"),HttpStatus.BAD_REQUEST);
    }   

без проблем в выводе. бежал гладко

второй API

@GetMapping(value="verifyOtp/{msisdn}/{otp}",consumes=MediaType.APPLICATION_JSON_VALUE)
public void verifyOtp(@PathVariable(value="msisdn",required=true)String msisdn,
        @PathVariable(value="otp",required=true)String otp,HttpServletResponse response) throws Exception{
    long l_time_start = System.currentTimeMillis();

    long l_time_end = System.currentTimeMillis();
    long l_diff = l_time_end-l_time_start;
    List<Object[]> list = repository.verifyOtp(msisdn,otp);
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");


    if(list!=null && list.size()>0) {
        for(Object[] obj:list) {
            String strDate = obj[3]==null?null:obj[3].toString();
            Date dtDb = sdf.parse(strDate);
            Date dtNow = new Date();
            String strDtNow = sdf.format(dtNow);
            dtNow = sdf.parse(strDtNow);

            long ldtDb = dtDb.getTime();
            long ldtNow = dtNow.getTime();
            if(ldtDb>ldtNow) {
                System.out.println("success within time");
                int ii = repository.updateIsActive(msisdn);
                response.setContentType("application/json");
                response.sendRedirect("http://localhost:9393/crbt/api/subscriber/ivr/checkStatus/"+msisdn);
            }
            else {
                System.out.println("failure time over!");
            }
        }
    }
    else {
    }

}   

второй Ответ API в почтальон

enter image description here

То, что я ожидал, было первым ответом API. Но это дает мне ошибку типа контента 415

Как я могу получить успешный ответ первого API json ответ от ответа второго API. Я даже попытался org.springframework.http.HttpHeaders, но не смог получить желаемый результат. Какие изменения я должен был сделать, чтобы получить первый ответ API в моем втором ответе API.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Проблема возникла из-за GetMapping.

@GetMapping(value="checkStatus/{msisdn}",consumes=MediaType.APPLICATION_JSON_VALUE)

замените на ниже в первом API:

@GetMapping(value="checkStatus/{msisdn}")
0 голосов
/ 06 февраля 2020

У меня странное чувство отвечать на ваши вопросы, потому что мне не нравится решение, которое я предоставил. Но это может помочь, поэтому я попробую.

По сути, ваш Контроллер - это всего лишь bean-компоненты Spring, что означает, что вы можете сделать это, имея зависимость, и второй контроллер вызовет первый контроллер. Это также изменит ваш метод verifyOtp, чтобы изменить тип возвращаемого значения.

Что-то вроде этого:

...
@Autowired
private FirstController firstController;
...

@GetMapping(value="verifyOtp/{msisdn}/{otp}",consumes=MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<CoreResponseHandler> verifyOtp(@PathVariable(value="msisdn",required=true)String msisdn,
        @PathVariable(value="otp",required=true)String otp,HttpServletResponse response) throws Exception{
    long l_time_start = System.currentTimeMillis();

    long l_time_end = System.currentTimeMillis();
    long l_diff = l_time_end-l_time_start;
    List<Object[]> list = repository.verifyOtp(msisdn,otp);
    SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");


    if(list!=null && list.size()>0) {
        for(Object[] obj:list) {
            String strDate = obj[3]==null?null:obj[3].toString();
            Date dtDb = sdf.parse(strDate);
            Date dtNow = new Date();
            String strDtNow = sdf.format(dtNow);
            dtNow = sdf.parse(strDtNow);

            long ldtDb = dtDb.getTime();
            long ldtNow = dtNow.getTime();
            if(ldtDb>ldtNow) {
                System.out.println("success within time");
                int ii = repository.updateIsActive(msisdn);
                return firstController.fetchOcsByDate2(msidn);
            }
            else {
                System.out.println("failure time over!");
                return null;
            }
        }
    }
    else {
         return null;
    }
}   

Я думаю, что вы пытаетесь достичь чего-то необычного и избежать Эта зависимость между контроллером, рассмотрим:

  • Измените ваш вариант использования. Сделайте так, чтобы второй контроллер возвратил HttpStatus.OK, и заставьте клиента сделать следующий вызов первому контроллеру
  • Создайте службу, отвечающую за загрузку msidn, которая позволит избежать дублирования кода и держать вас в более стандартная позиция, чтобы сделать наши эволюции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...