Spring Boot не может получить доступ к контроллеру REST

У меня простая проблема - SpringBootApplication не видит мой контроллер - что еще странно - только один из трех.

У меня есть UserController, WalletController и DashboardController — этот не виден для моего приложения.

То, что я уже сделал, это:

  1. Каждый пакет с контроллером находится в основном пакете, где находится мой SpringBootApplication.class,
  2. Я попытался аннотировать основной SpringBootApplication.class с помощью @ComponentScan как с basePackages, так и с basePackageClasses,
  3. Нет других bean-компонентов, которые должны быть аннотированы @Component, я удалил их и переместил методы в свой DashboardService.class.

Это мой контроллер, который не виден: Панель управления

А это моя структура пакета (вроде правильная): Структура пакета

Спасибо за помощь!

Обновлено:

Может быть важно, чтобы я использовал сторонний API для получения нужных мне данных.

В этих методах я использую URL:

    private String getNbpJson(String url) {
        return new RestTemplate().getForObject(url, String.class);
    }

    private CurrentRateDTO getCurrentExchangeRate(String json) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();

        JsonNode node = mapper.readTree(json);

        String code = node.get("code").toString();
        String date = node.get("rates").get(0).get("effectiveDate").toString();

        double bid = node.get("rates").get(0).get("bid").asDouble();
        double ask = node.get("rates").get(0).get("ask").asDouble();

        return new CurrentRateDTO(code, date, bid, ask);
    }

А потом в ExchangeService это мой URL

@Service
public class ExchangeRateService implements IExchangeRateService {

    private static final Logger logger = LoggerFactory.getLogger(ExchangeRateService.class);

    private String NBP_CURRENT_RATE_URL = "http://api.nbp.pl/api/exchangerates/rates/c/eur/2020-12-11/?format=json";

Более того... когда я перемещаю методы из DashboardController в WalletController (что работает)

Еще я обнаружил, что не работают только методы, использующие сторонний API. По сути, я извлекаю данные из приведенного выше URL-адреса — получаю определенные поля, создаю объекты с заполненными полями.

Может ли быть проблема с получением данных от третьих лиц и их последующей реализацией в моем приложении?

Больше идей у ​​меня пока нет...

По умолчанию, если в bean-компоненте есть только один конструктор public, он будет автоматически подключен Spring с внедрением конструктора, нет необходимости в явной аннотации @Autowired.

Karol Dowbecki 12.12.2020 18:37

Пробовали @SpringBootApplication(scanBasePackages = {"pl.agn.exchange"})?

Karol Dowbecki 12.12.2020 18:39

Да, я уже перепробовал все эти вещи, связанные со сканированием пакетов, поэтому я понятия не имею, что может быть не так и почему это происходит.

paweto 12.12.2020 18:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
668
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, ваш контроллер зарегистрирован, но вы вводите немного другой URL-адрес. Попробуйте это свойство logging.level.org.springframework.web.servlet.mvc.method.annotation: TRACE

и проверьте при запуске приложения, зарегистрирован ли контроллер под каким-либо другим URL-адресом.

Попробуйте добавить это в свой контроллер

@RestController()   
@RequestMapping("exchangerates")

Это интересно... Я оставил аннотацию своего контроллера в виде @RestController("/exchangerates), но свойство, которое вы мне показали, отображает это: p.a.e.d.DashboardController: {GET /rate/{currencyCode}}: getCurrentRate(String)

paweto 12.12.2020 19:36

вот что я подумал, когда увидел путь к твоему контроллеру;)

Panagiotis Bougioukos 12.12.2020 19:38

Хорошо, я, наверное, обнаружил проблему ... До того, как у меня будет 3 контроллера:

@RestController("/api")
public class UserController {}

@RestController("/wallets")
public class WalletController {}

@RestController("/exchangerates")
public class DashboardController {}

Я изменил выше на

@RestController("/api")
public class UserController {}

@RestController
public class WalletController {}

@RestController
public class DashboardController {}

Итак, в основном я удалил базовую «конечную точку»? для каждого контроллера, и теперь это работает... Кажется, что основных конечных точек в трех RestControllers слишком много, а третий недоступен, но я не знаю, правда ли это (держу пари, что это не так).

Почему тогда это произошло, кто-нибудь может объяснить такое поведение контроллеров? Спасибо за объяснение.

проверьте мой обновленный ответ выше с другой аннотацией.

Panagiotis Bougioukos 12.12.2020 19:43

Другие вопросы по теме