Spring 启动无法访问 REST 控制器
Spring Boot can't access REST Controller
我有一个简单的问题 - SpringBootApplication 没有看到我的控制器 - 更奇怪的是 - 只有三个中的一个。
我有 UserController、WalletController 和 DashboardController - 这一个对我的应用程序不可见。
我已经做的是:
- 每个带控制器的包都在主包下,我的SpringBootApplication.class是,
- 我尝试使用 basePackages 和 basePackageClasses @ComponentScan 注释 main SpringBootApplication.class,
- 没有其他 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 中检索数据 - 我得到特定的字段,创建一个填充字段的对象。
从第三方获取数据然后在我的应用程序中实现它会不会有问题?
我现在没有更多的想法...
可能您的控制器已注册,但您键入的内容略有不同 url。试试这个 属性 logging.level.org.springframework.web.servlet.mvc.method.annotation: TRACE
并检查应用程序启动是否在其他url下注册了控制器。
尝试将此添加到您的控制器
@RestController()
@RequestMapping("exchangerates")
好吧,我大概发现问题了……在我有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 中的基本端点太多了,第三个不可用,但我不知道这是真的(我我敢打赌它不是)。
为什么会这样,谁能解释一下控制器的这种行为?
谢谢你的解释。
我有一个简单的问题 - SpringBootApplication 没有看到我的控制器 - 更奇怪的是 - 只有三个中的一个。
我有 UserController、WalletController 和 DashboardController - 这一个对我的应用程序不可见。
我已经做的是:
- 每个带控制器的包都在主包下,我的SpringBootApplication.class是,
- 我尝试使用 basePackages 和 basePackageClasses @ComponentScan 注释 main SpringBootApplication.class,
- 没有其他 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 中检索数据 - 我得到特定的字段,创建一个填充字段的对象。
从第三方获取数据然后在我的应用程序中实现它会不会有问题?
我现在没有更多的想法...
可能您的控制器已注册,但您键入的内容略有不同 url。试试这个 属性 logging.level.org.springframework.web.servlet.mvc.method.annotation: TRACE
并检查应用程序启动是否在其他url下注册了控制器。
尝试将此添加到您的控制器
@RestController()
@RequestMapping("exchangerates")
好吧,我大概发现问题了……在我有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 中的基本端点太多了,第三个不可用,但我不知道这是真的(我我敢打赌它不是)。
为什么会这样,谁能解释一下控制器的这种行为? 谢谢你的解释。