Type of mismatch: cannot convert from String to ListenableFuture <String>

I am trying to implement a non-blocking call. in spring 4, but unfortunately it throws an error below.

Type mismatch: cannot convert from String to ListenableFuture

and also the same error cannot convert from Map to ListenableFuture>.

My stack of method calls is as follows.

ListenableFuture<Map<String,String>> unusedQuota = doLogin(userIdentity,request,"0");

doLogin login just returns a map

Do I need any converter?

what changes will be required?

Thank.

public class MyController {



final DeferredResult<Map<String,String>> deferredResult = new DeferredResult<Map<String,String>>(5000l);

private final Logger log = LoggerFactory.getLogger(MyController.class);

 @Inject
 RestTemplate restTemplate;


    @RequestMapping(value = "/loginservice", method = RequestMethod.GET)
    @Timed
    public DeferredResult<Map<String,String>> loginRequestService(@RequestParam String userIdentity,HttpServletRequest request) throws Exception {
        deferredResult.onTimeout(new Runnable() {

            @Override
            public void run() { // Retry on timeout
                deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT).body("Request timeout occurred."));
            }
        });

        @SuppressWarnings("unchecked")
        ListenableFuture<Map<String,String>> unusedQuota =  doLogin(userIdentity,request);
        unusedQuota.addCallback(new ListenableFutureCallback<Map<String,String>>() {

            @SuppressWarnings("unchecked")
            @Override
            public void onSuccess(Map<String, String> result) {
                // TODO Auto-generated method stub
                deferredResult.setResult((Map<String, String>) ResponseEntity.ok(result));
            }

            @Override
            public void onFailure(Throwable t) {
                // TODO Auto-generated method stub
                deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(t));
            }

        });             
        return deferredResult;

    }


    private Map<String,String> doLogin(String userIdentity,HttpServletRequest request) throws Exception{

        Map<String,String> unusedQuota=new HashMap<String,String>();

        unusedQuota.put("quota", "100");
        return unusedQuota;
        }


    }

}

+4
source share
1 answer

Map, , , , , deferredResult , deferredResult .

public class MyController {

     @Autowired
     private TaskExecutor asyncTaskExecutor; 

    @RequestMapping(value = "/loginservice", method = RequestMethod.GET)
    @Timed
    public DeferredResult<Map<String,String>> loginRequestService(@RequestParam String userIdentity,HttpServletRequest request) throws Exception {

                final DeferredResult<Map<String,String>> deferredResult = new DeferredResult<Map<String,String>>(5000l);

                deferredResult.onTimeout(new Runnable() {

                    @Override
                    public void run() { // Retry on timeout
                        Map<String, String> map = new HashMap<>();
                        //Populate map object with error details with Request timeout occurred.

                        deferredResult.setErrorResult(new ResponseEntity
                                   <Map<String, String>>(map, null,  
                                          HttpStatus.REQUEST_TIMEOUT));

                    }
                });

            ListenableFuture<String> task = asyncTaskExecutor.submitListenable(new Callable<String>(){
        @Override
        public Map<String,String> call() throws Exception {
            return doLogin(userIdentity,request);
        }
        });

                unusedQuota.addCallback(new ListenableFutureCallback<Map<String,String>>() {

                    @SuppressWarnings("unchecked")
                    @Override
                    public void onSuccess(Map<String, String> result) {
                        // TODO Auto-generated method stub
                        deferredResult.setResult((Map<String, String>) ResponseEntity.ok(result));
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        Map<String, String> map = new HashMap<>();
                        //Populate map object with error details

                       deferredResult.setErrorResult(new ResponseEntity<Map<String, String>>(
                       map, null, HttpStatus.INTERNAL_SERVER_ERROR));
                    }

                });       
                return deferredResult;
            }
     }

, , ThreadPoolTaskExecutor, .

+1

Source: https://habr.com/ru/post/1662104/


All Articles