【问题标题】:Spring Boot can't access REST ControllerSpring Boot 无法访问 REST 控制器
【发布时间】:2021-03-23 20:00:27
【问题描述】:

我有一个简单的问题 - SpringBootApplication 看不到我的控制器 - 更奇怪的是 - 只有三个之一。

我有 UserController、WalletController 和 DashboardController - 这对我的应用程序不可见。

我已经做的是:

  1. 每个带有控制器的包都在主包下,我的 SpringBootApplication.class 在哪里,
  2. 我尝试使用 basePackages 和 basePackageClasses 用 @ComponentScan 注释主 SpringBootApplication.class
  3. 没有其他 bean - 应该注释 @Component,我删除它们并将方法移动到我的 DashboardService.class

这是我的控制器,不可见: DashboardController

这是我的包结构(似乎是对的):Package Structure

感谢您的帮助!

编辑:

我使用第三方 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 注释。
  • 你试过@SpringBootApplication(scanBasePackages = {"pl.agn.exchange"})吗?
  • 是的,我已经尝试过所有与扫描包相关的事情 - 因此我不知道可能出了什么问题以及为什么会发生这种情况。

标签: java spring-boot rest spring-restcontroller


【解决方案1】:

也许您的控制器已注册,但您输入的网址略有不同。试试这个属性logging.level.org.springframework.web.servlet.mvc.method.annotation: TRACE

并检查应用程序启动时控制器是否在其他 url 下注册。

尝试将此添加到您的控制器中

@RestController()   
@RequestMapping("exchangerates")

【讨论】:

  • 这很有趣...我让我的 Controller 注释看起来像 @RestController("/exchangerates),但是你展示给我的属性显示了这个:p.a.e.d.DashboardController: {GET /rate/{currencyCode}}: getCurrentRate(String)
  • 当我看到你的控制器路径时,我就是这么想的 ;)
【解决方案2】:

好的,我可能发现了问题……在我有 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 {}

所以,基本上我删除了 base ?endpoint?对于每个控制器,现在它可以工作了......似乎三个 RestControllers 中的基本端点太多了,第三个不可用,但我不知道这是真的(我打赌它是不是)。

为什么会发生这种情况,谁能解释控制器的行为? 谢谢你的解释。

【讨论】:

  • 用另一个注释检查我上面的更新答案。
猜你喜欢
  • 2017-03-12
  • 2015-09-27
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 2017-02-16
  • 2016-09-18
相关资源
最近更新 更多