我正在尝试使用可选地图来返回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,但将“ body”推断为ResponseEntity:不存在类型变量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()来解决这个问题