有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法重定向rest控制器中的响应

我制作了两个RestControllerapi。在第二个api的响应中,我想要第一个api的响应(它是json响应),所以我尝试使用HttpServletResponse.redirect。我还将requiredcontent type设置为它。但是在第二个api响应中,我得到了Unsupported Media Type{}

第一个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的响应中获得第一个API的成功json响应。。我甚至尝试了org.springframework.http.HttpHeaders,但没有得到想要的输出。为了在第二个Api响应中得到第一个Api的响应,我必须做哪些更改


共 (2) 个答案

  1. # 1 楼答案

    回答你的问题我有一种奇怪的感觉,因为我不喜欢我将提供的解决方案。但可能会有帮助,所以我会试试看

    基本上,您的控制器只是Springbean,这意味着您可以做的就是拥有一个依赖项,第二个控制器将调用第一个控制器。这还将更改方法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的服务,这将避免重复代码,并使您处于更标准的位置,以进行我们的改进
  2. # 2 楼答案

    由于GetMapping而出现问题

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

    在第一个Api中替换为以下内容:

    @GetMapping(value="checkStatus/{msisdn}")