如何修复Spring Boot集成Okta时找不到OktaOAuth2Properties Bean的问题
问题描述
我参照官方教程为使用Java 11的Spring Boot应用添加社交登录功能时遇到启动报错,查阅相关公开问答均未找到解决方案,具体信息如下:
报错信息
*************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in com.okta.spring.example.controllers.LoginController required a bean of type 'com.okta.spring.boot.oauth.config.OktaOAuth2Properties' that could not be found. Action: Consider defining a bean of type 'com.okta.spring.boot.oauth.config.OktaOAuth2Properties' in your configuration.
项目结构
src |-- main | |-- java | | |-- com | | | |-- okta | | | | |-- spring | | | | | |-- example | | | | | | |-- HostedLoginCodeFlowExampleApplication.java | | | | | | |-- controllers | | | | | | | |-- HomeController.java | | | | | | | |-- LoginController.java | | | | | | | |-- UserDetailsController.java | |-- resources | | |-- application.template.yml | | |-- static | | | |-- img | | | | |-- icon-spring-cloud.svg | | |-- templates | | | |-- 403.html | | | |-- head.html | | | |-- home.html | | | |-- login.html | | | |-- menu.html | | | |-- userProfile.html |-- test | |-- resources | | |-- logback.xml | | |-- package.json | | |-- testRunner.yml
LoginController核心代码
@Controller public class LoginController { private static final String STATE = "state"; private static final String NONCE = "nonce"; private static final String SCOPES = "scopes"; private static final String OKTA_BASE_URL = "oktaBaseUrl"; private static final String OKTA_CLIENT_ID = "oktaClientId"; private static final String REDIRECT_URI = "redirectUri"; private static final String ISSUER_URI = "issuerUri"; private final OktaOAuth2Properties oktaOAuth2Properties; public LoginController(OktaOAuth2Properties oktaOAuth2Properties) { this.oktaOAuth2Properties = oktaOAuth2Properties; } @GetMapping(value = "/signin") public ModelAndView login(HttpServletRequest request, @RequestParam(name = "state", required = false) String state, @RequestParam(name = "nonce") String nonce) throws MalformedURLException { // if we don't have the state parameter redirect if (state == null) { return new ModelAndView("redirect:" + oktaOAuth2Properties.getRedirectUri()); } String issuer = oktaOAuth2Properties.getIssuer(); // the widget needs the base url, just grab the root of the issuer String orgUrl = new URL(new URL(issuer), "/").toString(); ModelAndView mav = new ModelAndView("login"); mav.addObject(STATE, state); mav.addObject(NONCE, nonce); mav.addObject(SCOPES, oktaOAuth2Properties.getScopes()); mav.addObject(OKTA_BASE_URL, orgUrl); mav.addObject(OKTA_CLIENT_ID, oktaOAuth2Properties.getClientId()); // from ClientRegistration.redirectUriTemplate, if the template is change you must update this mav.addObject(REDIRECT_URI, request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/authorization-code/callback" ); mav.addObject(ISSUER_URI, issuer); return mav; } @GetMapping("/post-logout") public String logout() { return "logout"; } @GetMapping("/403") public String error403() { return "403"; } }
修复方案
按照以下顺序排查即可解决问题:
- 检查Okta OAuth2 Starter依赖是否正确引入
确认pom.xml(Maven)或build.gradle(Gradle)中已添加Okta Spring Boot OAuth2启动器依赖,示例Maven依赖如下:<dependency> <groupId>com.okta.spring</groupId> <artifactId>okta-spring-boot-starter</artifactId> <version>2.1.6</version> </dependency> - 修正配置文件
你当前的配置文件为application.template.yml,这是模板文件不会被Spring Boot默认加载,需要复制该文件并重命名为application.yml,填写完整Okta相关配置项,示例配置如下:okta: oauth2: issuer: https://{your-okta-domain}/oauth2/default client-id: {your-client-id} client-secret: {your-client-secret} redirect-uri: {your-redirect-uri} scopes: openid,profile,email - 检查启动类配置
确保启动类HostedLoginCodeFlowExampleApplication上已添加@SpringBootApplication注解,若自定义了@ComponentScan的扫描范围,需要保证没有排除Okta相关配置类;也可以直接在启动类上添加@EnableConfigurationProperties(com.okta.spring.boot.oauth.config.OktaOAuth2Properties.class)注解,手动启用该配置类的自动注入。 - 验证版本兼容性
确认使用的Okta Starter版本支持Java 11,推荐使用2.x及以上的稳定版本,避免版本不兼容导致配置类无法加载。
内容的提问来源于stack exchange,提问作者invzbl3
相关产品推荐
相关产品推荐

