#java #spring #api #rest #consumer
#java #spring #API #отдых #потребитель
Вопрос:
У меня есть приложение Spring boot, к которому я добавил rest API. Оно отлично работает, когда я использую его только с моим «Приложением фильмов». Однако я создал второе приложение, которому необходимо использовать rest API для двух конечных точек.
- Фильмы, выпущенные в определенном году
- Фильмы, снятые конкретным режиссером
В данный момент я работаю над первой, и хотя ранее она выдавала ошибку «не найдено», я исправил это, и теперь я просто получаю ошибку белой метки. Похоже, что оно не использует данные. Я не уверен, что я только что ввел что-то неправильно или весь мой подход неверен.
Поэтому, когда я запускаю свое потребительское приложение одновременно с моим проектом Movies, я должен иметь возможность зайти в свой браузер и ввести localhost:8080 / api / films{ReleaseYear}, и оно должно вернуть все фильмы за этот год на странице. Так, например, если бы год выпуска был 2015, я бы ввел localhost: 8080 / api / films / 2015 и посмотрел фильмы, хранящиеся в моей базе данных, которые были выпущены в этом году в формате Json.
My domain (Film.class)
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Director {
private int directorId;
private String directorFirstName;
private String directorSurname;
private List<Film> films = new ArrayList<>();
}
Мой FilmController в rest-потребителе:
@Controller
@Slf4j
public class FilmController {
@GetMapping("/films/{releaseYear}")
public String showFilmsByYear(@PathVariable(name="releaseYear") int releaseYear, Model model)
{
try {
RestTemplate restTemplate = new RestTemplate();
String URL="http://localhost:8080/api/films/{releaseYear}";
ParameterizedTypeReference<List<Film>> listOfFilms = new ParameterizedTypeReference<List<Film>>(){};
ResponseEntity<List<Film>> responseEntity = restTemplate.exchange(URL, HttpMethod.GET, null, listOfFilms );
List<Film> films = responseEntity.getBody();
log.info(responseEntity.getHeaders().toString());
model.addAttribute("films", films);
return "films";
}
catch (HttpClientErrorException ex) {
model.addAttribute("exception", ex); //exception isnt handled because hitting whitelabel
return "notfound";
}
}
Мой formObject:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class FilmForm {
@Size(min=2, max=20)
@NotEmpty
@NotBlank
private String filmName;
//add minimum year and max year (won't always be 2020, but can't allow films that are further then current year)
@PastOrPresent
@NotBlank
@Min(1888)
private int releaseYear;
@NotEmpty
private Director director;
}
Мой html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<div th:insert="fragments.html :: head"></div>
<body>
<header>
<div th:insert="fragments.html :: menu"></div>
<h1><span th:text="#{films.heading}"></span></h1>
</header>
<main>
<table>
<tr>
<th th:text="#{films.id}"></th>
<th th:text="#{films.filmName}"></th>
<th th:text="#{films.directorFirstName}"></th>
<th th:text="#{films.directorSurname}"></th>
<th th:text="#{films.releaseYear}"></th>
</tr>
<tr th:each="film,iterationCount : ${films}" th:class="${iterationCount.even}? 'even'" th:object="${film}" >
<td th:text="*{filmId}"></td>
<td th:text="*{filmName}"></td>
<td th:text="*{director.directorFirstName}"></td>
<td th:text="*{director.directorSurname}"></td>
<th th:text="*{releaseYear}"></th>
</tr>
</table>
</main>
</body>
<footer th:insert="fragments.html :: footer">
</footer>
</html>
Ему не должна нужна форма, потому что он не использует html, но я просто подумал, что включу для ясности.
Контроллер, которого я пытаюсь достичь в моем проекте Movies, является:
@RestController
@RequestMapping("/api")
public class RestControllerDir{
@Autowired
FilmService filmService;
@Autowired
DirectorService directorService;
@GetMapping("directors")
public List<Director> myRestDirectors(){
return directorService.listInAlphabeticalOrder();
}
@GetMapping("filmsByDirector/{id}")
public List<Film> myRestFilms(@PathVariable("id") int id)
{
return directorService.findDirector(id).getFilms(); //returns the films directed by a particular director
}
@GetMapping("viewFilmsByYear/{releaseYear}")
public List<Film> myRestFilmsYear(@PathVariable("releaseYear") int releaseYear)
{
return filmService.findFilmsByReleaseYear(releaseYear); //returns the films released in a particular year
}
Комментарии:
1. можете ли вы сказать, что точно не работает, это неясно
2. @JAsgarov Извините! Поэтому, когда я запускаю свое потребительское приложение одновременно с моим проектом Movies, я должен иметь возможность зайти в свой браузер и ввести localhost: 8080 / api / films {ReleaseYear}, и оно должно вернуть все фильмы за этот год. Так, например, если бы год выпуска был 2015, я бы ввел localhost: 8080 / api / films / 2015 и посмотрел фильмы, хранящиеся в моей базе данных, которые были выпущены в этом году.
3. ваше приложение
@GetMapping("/films/{releaseYear}")
не включаетapi
в себя4. За что отвечает контроллер
/api/films{releaseYear}
?5. Я попытался добавить это в @GetMapping, и с ним возникла та же проблема. Также только что попробовал @RequestMapping («/ api») под моей аннотацией @Controller и тоже не сработал.