You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak+Spring Boot登录报空指针:getAuthUrl()返回null

Keycloak + Spring Boot 认证服务500错误排查

问题现象

通过Docker Compose部署Keycloak并关联PostgreSQL,结合Spring Boot搭建认证服务,曾正常登录获取Token,后续测试时出现500服务器错误,报错信息:

java.lang.NullPointerException: Cannot invoke "org.keycloak.common.util.KeycloakUriBuilder.clone()" because the return value of "org.keycloak.adapters.KeycloakDeployment.getAuthUrl()" is null

相关配置与代码

Docker Compose配置

version: '3'

volumes:
  postgres_data:
    driver: local

services:
  postgres:
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak_local
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: keycloak
  keycloak:
    image: quay.io/keycloak/keycloak:legacy
    environment:
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycloak_local
      DB_USER: keycloak
      DB_SCHEMA: public
      DB_PASSWORD: keycloak
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: admin
    ports:
      - 8080:8080
    depends_on:
      - postgres

Spring Boot应用配置

server.port = 8090
keycloak.realm=lbv-realm
keycloak.resource=auth-client
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.ssl-required=none
keycloak.public-client=true 

Keycloak配置类

@Bean
public KeycloakSpringBootConfigResolver keycloakConfigResolver() {
    return new KeycloakSpringBootConfigResolver();
}

登录服务方法

public ResponseEntity<LoginResponse> login(LoginRequest loginrequest) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("client_id",client_id );
    map.add("client_secret", client_secret);
    map.add("grant_type", grant_type);
    map.add("username", loginrequest.getUsername());
    map.add("password", loginrequest.getPassword());
    HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map,headers);
    ResponseEntity<LoginResponse> response = restTemplate.postForEntity("http://localhost:8080/auth/realms/lbv/protocol/openid-connect/token", httpEntity, LoginResponse.class);
    return new ResponseEntity<>(response.getBody(),HttpStatus.OK);
}

登录控制器

@PostMapping("/login")
public ResponseEntity<LoginResponse> login (@RequestBody LoginRequest loginrequest) {
    return loginservice.login(loginrequest);
}

排查与解决思路

1. 确认Keycloak服务可用性

  • 执行docker-compose ps检查keycloak容器状态,若未启动则用docker-compose up -d keycloak重启
  • 访问http://localhost:8080/auth/admin,确认能正常登录管理控制台,且lbv-realm和auth-client配置未被修改

2. 验证配置一致性

  • 核对keycloak.realm=lbv-realm与Keycloak中实际Realm名称完全一致(注意大小写)
  • 测试keycloak.auth-server-url=http://localhost:8080/auth的连通性,执行curl http://localhost:8080/auth,确保返回正常页面

3. 修复空指针核心问题

该错误是因为KeycloakDeployment未正确加载配置导致authUrl为空,可尝试:

  • 确认Spring Boot配置文件在src/main/resources目录下,且未被其他配置覆盖
  • 重启Spring Boot应用,确保最新配置生效
  • 由于配置中keycloak.public-client=true,公开客户端无需传递client_secret,删除登录请求中的map.add("client_secret", client_secret);代码行

4. 检查数据库连接

  • 查看Keycloak容器日志docker-compose logs keycloak,排查是否有数据库连接失败的报错
  • 若数据库数据损坏,执行docker-compose down -v删除数据卷,再docker-compose up -d重新初始化数据库与Keycloak

内容的提问来源于stack exchange,提问作者Nouhaila Khaouti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:20:33