java - 无法在其余 Controller 中重定向响应

标签 java spring spring-boot

我制作了两个 RestController api。在第二个 api 的响应中,我想要第一个 api 的响应(这是一个 json 响应),所以我尝试使用 HttpServletResponse.redirect。我还为其设置了所需的内容类型。但在第二个 api 响应中,我得到了 Unsupported Media Type Content type 'null' not support

第一个 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 {
    }

}   

postman 中的第二个 Api 响应

enter image description here

我期望的是第一个 API 的响应。但它给了我一些 415 内容类型错误

如何从第二个 API 的响应中获取第一个 API 的成功 json 响应。我什至尝试了 org.springframework.http.HttpHeaders 但无法获得所需的输出。为了在第二个 API 响应中获得第一个 Api 的响应,我必须做哪些更改。

最佳答案

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

基本上,您的 Controller 只是 Spring bean,这意味着您可以做的是具有依赖关系,第二个 Controller 将调用第一个 Controller 。这还将更改您的方法 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;
    }
}   

我认为您正在尝试实现一些不常见的目标,并且为了避免 Controller 之间存在这种依赖关系,请考虑:

  • 更改您的用例。让第二个 Controller 返回 HttpStatus.OK,并让客户端对第一个 Controller 进行下一次调用
  • 创建一个负责加载 msidn 的服务,这将避免重复代码,并使您处于更标准的位置来插入我们的发展。

关于java - 无法在其余 Controller 中重定向响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089597/

相关文章:

java - 使用 iText 创建不可见的 PDF 对象

java - hibernate ,测试集合是否已完全加载

java - 当我在不存储返回值的情况下调用 "new Object()"时,返回的对象会发生什么情况?

java - 将 Spring Security 与 JPA 结合使用

java - spring-ws 获取用户名和密码

java - 在具有多个数据源的 JBOSS 上部署应用程序时出现问题

java - 部署在 spring-cloud-dataflow-server 中的服务如何连接到另一个数据库而不是数据流服务器使用的数据库?

java - 使用 JUnit 测试构造函数(或 setter)的最佳方法是什么?

java - Spring Data,JPA @ManyToOne 延迟初始化不起作用

spring boot 覆盖默认的 REST 异常处理程序