Несовместимые типы, использующие ResponseEntity с необязательным

#java #spring

#java #spring

Вопрос:

Я пытаюсь использовать необязательную карту для возврата ответа ok со значением, если значение присутствует, а если нет, я хочу вернуть карту с кодом состояния 4xx.

 public ResponseEntity createUrl(@RequestBody String url){
        return service.createUrl(url)
                .map(ResponseEntity::ok)
                .orElseGet(() -> ResponseEntity.status(HttpStatus.CONFLICT).body(Collections.singletonMap("error","Invalid url")));
}
  

Это говорит:
Несовместимые типы. Требуется ResponseEntity, но для ResponseEntity было выведено ‘body’: не существует экземпляров переменных типа K, V, так что Map соответствует переменной вывода Url T имеет несовместимые границы: ограничения равенства: нижние границы Url: Map

Но это работает так:

 public ResponseEntity createUrl(@RequestBody String url){
        if(service.createUrl(url).isPresent()){
            return service.createUrl(url).map(ResponseEntity::ok).get();
        }else{
            return ResponseEntity.status(HttpStatus.CONFLICT).body(Collections.singletonMap("error","Invalid url"));
        }
}
  

Метод createUrl из службы:

     public Optional<Url> createUrl(String url){
        try {
            URL myURL = new URL(url);
            URLConnection myURLConnection = myURL.openConnection();
            myURLConnection.connect();
            if(repository.existsByOriginalUrl(url)){
                return Optional.of(repository.getByOriginalUrl(url));
            }else{
                return Optional.of(repository.save(new Url(url,null)));
            }
        } catch (IOException e) {
            return Optional.empty();
        }
    }
  

Я хочу избежать использования isPresent() и решить это с помощью map() и orElseGet()

Комментарии:

1. что именно createUrl возвращает?

2. он возвращает необязательный<Url>

3. можете ли вы показать объявление метода и возвращаемый тип?

4. проверьте мой ответ, и я спрашиваю о методе, который состоит из этого ResponseEntity кода, а не createUrl извинения за путаницу

5. Используя необязательный, вы не можете возвращать два разных типа объектов