#java #spring-boot #mocking
#java #spring-boot #издевательство
Вопрос:
Я новичок в попытке смоделировать внешний API в Spring Boot.
Вот API: https://jsonplaceholder.typicode.com/posts
Он возвращает строку JSON следующим образом:
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipitnsuscipit recusandae consequuntur expedita et cumnreprehenderit molestiae ut ut quas totamnnostrum rerum est autem sunt rem eveniet architecto"
},
...
Я попробовал следующий код:
@Service
public class BlogPostService {
@Autowired
private RestTemplate restTemplate;
public String getAllBlogPosts() {
ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", String.class);
return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
}
Но в IDE есть ошибка в resp.getBody(), которая гласит:
Несоответствие типов: невозможно преобразовать из объекта в строку
Вот мой код для публикации в блоге:
public class BlogPost {
private int userId;
private String title;
private String body;
public BlogPost() {
}
public BlogPost(int userId, String title, String body) {
this.title = title;
this.body = body;
}
//...getters amp; setters
Как я могу это исправить? Надеюсь, без использования еще одного инструмента. Это всего лишь простое приложение для проверки концепции, поэтому я не хочу использовать JUnit или Mockito для тестирования.
Ответ №1:
API https://jsonplaceholder.typicode.com/posts
возвращает массив объектов JSON. Вам нужно будет отразить это в желаемом типе ответа вашего запроса:
public String getAllBlogPosts() {
ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", BlogPost[].class);
return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
Обратите []
внимание на BlogPost[].class
.
Затем вы получаете a Type mismatch: cannot convert from Object to String
, поскольку ResponseBody.getBody()
возвращает общий тип T
, который есть BlogPost[]
, но ваша сигнатура метода возвращает a String
.
Если все, что вам нужно, это строка JSON, то вы можете просто сделать это:
public String getAllBlogPosts() {
ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", String.class);
return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
В противном случае, если вам нужен фактический массив POJO, сделайте это:
public BlogPost[] getAllBlogPosts() {
ResponseEntity resp = restTemplate.getForEntity("http://localhost:8080/posts", BlogPost[].class);
return resp.getStatusCode() == HttpStatus.OK ? resp.getBody() : null;
}
Комментарии:
1. Спасибо, что указали на эту глупую ошибку. Приятно знать, что я приближаюсь. Я внес изменения в String.class и обновил свой пост этим. К сожалению, я все еще получаю ту же ошибку.
2. Я исправил это, изменив строку на: ResponseEntity<String> resp = RestTemplate.getForEntity(» localhost:8080/posts «, String.class );