Мое потребительское приложение REST API продолжает попадать на страницу с ошибкой белой метки

#java #spring #api #rest #consumer

#java #spring #API #отдых #потребитель

Вопрос:

У меня есть приложение Spring boot, к которому я добавил rest API. Оно отлично работает, когда я использую его только с моим «Приложением фильмов». Однако я создал второе приложение, которому необходимо использовать rest API для двух конечных точек.

  1. Фильмы, выпущенные в определенном году
  2. Фильмы, снятые конкретным режиссером

В данный момент я работаю над первой, и хотя ранее она выдавала ошибку «не найдено», я исправил это, и теперь я просто получаю ошибку белой метки. Похоже, что оно не использует данные. Я не уверен, что я только что ввел что-то неправильно или весь мой подход неверен.

Поэтому, когда я запускаю свое потребительское приложение одновременно с моим проектом 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 и тоже не сработал.