首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >捕获异常RESTEASY004645: templateValues条目为空

捕获异常RESTEASY004645: templateValues条目为空
EN

Stack Overflow用户
提问于 2022-11-01 19:15:36
回答 1查看 57关注 0票数 -1

我正在为AdminClientService创建测试,它会将用户创建到Keycloak数据库中。在主要处理过程中,它按应有的方式工作,但在创建测试时,我遇到了这个异常:

代码语言:javascript
运行
复制
java.lang.NullPointerException: RESTEASY004645: templateValues entry was null
        at com.springboot.services.KeycloakAdminClientServiceTest.createKeycloakUserTest(KeycloakAdminClientServiceTest.java:80)

下面是测试,我目前正在运行:

代码语言:javascript
运行
复制
@SpringBootTest
public class KeycloakAdminClientServiceTest {
    @Value("${keycloak.auth-server-url}")
    public String serverUrl;
    @Value("${keycloak.realm}")
    public String realm;
    @Value("${keycloak.resource}")
    public String clientId;
    @Value("${keycloak.credentials.secret}")
    public String clientSecret;
    
    // @Mock
    // KeycloakProvider kcProvider = Mockito.mock(KeycloakProvider.class);
    
    // @InjectMocks
    // 
    
    // @BeforeEach
    // void setMockOutput() {
    //     //when(helloService.get()).thenReturn("Hello Mockito");
    //     Mockito.when(kcProvider.getInstance()).thenReturn(KeycloakBuilder.builder()
    //         .realm(realm)
    //         .serverUrl(serverUrl)
    //         .clientId(clientId)
    //         .clientSecret(clientSecret)
    //         .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
    //         .build());
    // }
    KeycloakProvider kcProvider;
    KeycloakAdminClientService kcAdminClientService;
    
    @BeforeEach
    void createKeycloakProvider() {
        kcProvider = new KeycloakProvider();
        kcProvider.setServerUrl(serverUrl);
        kcProvider.setRealm(realm);
        kcProvider.setClientId(clientId);
        kcProvider.setClientSecret(clientSecret);
        kcAdminClientService = new KeycloakAdminClientService(kcProvider);
    }
    
    @Test
    public void createKeycloakUserTest(){
        Integer generatedInteger = (int) ((Math.random() * (9999999 - 1000000)) + 1000000);
        String generatedString = generatedInteger.toString();

        CreateUserRequest createUserRequest = new CreateUserRequest();
        createUserRequest.setUsername("admin_client_username_" + generatedString);
        createUserRequest.setPassword("admin_client_password");
        createUserRequest.setEmail("admin_client_email_" + generatedString + "@gmail.com");
        createUserRequest.setFirstname("admin_client_firstname_" + generatedString);
        createUserRequest.setLastname("admin_client_lastname_" + generatedString);
        
        kcAdminClientService.createKeycloakUser(createUserRequest);
        
        UsersResource usersResource = kcProvider.getInstance()
            .realm(kcAdminClientService.realm).users();
        List<UserRepresentation> userRepresentation = usersResource
            .search("admin_client_email_" + generatedString + "@gmail.com");
        assertNotNull(userRepresentation);
        assertEquals("admin_client_firstname_" + generatedString,
            userRepresentation.get(0).getFirstName());

    }

}

以下是服务:

代码语言:javascript
运行
复制
@Service
public class KeycloakAdminClientService {
    @Value("${keycloak.realm}")
    public String realm;

    private final KeycloakProvider kcProvider;


    public KeycloakAdminClientService(KeycloakProvider keycloakProvider) {
        this.kcProvider = keycloakProvider;
    }

    public Response createKeycloakUser(CreateUserRequest user) {
        UsersResource usersResource = kcProvider.getInstance().realm(realm).users();
        CredentialRepresentation credentialRepresentation = createPasswordCredentials(
            user.getPassword());

        UserRepresentation kcUser = new UserRepresentation();
        kcUser.setUsername(user.getEmail());
        kcUser.setCredentials(Collections.singletonList(credentialRepresentation));
        kcUser.setFirstName(user.getFirstname());
        kcUser.setLastName(user.getLastname());
        kcUser.setEmail(user.getEmail());
        kcUser.setEnabled(true);
        kcUser.setEmailVerified(false);
        Response response = usersResource.create(kcUser);

        return response;

    }

    private static CredentialRepresentation createPasswordCredentials(String password) {
        CredentialRepresentation passwordCredentials = new CredentialRepresentation();
        passwordCredentials.setTemporary(false);
        passwordCredentials.setType(CredentialRepresentation.PASSWORD);
        passwordCredentials.setValue(password);
        return passwordCredentials;
    }
}

KeycloakProvider:

代码语言:javascript
运行
复制
@Configuration
@Getter
@Setter
public class KeycloakProvider {
    @Value("${keycloak.auth-server-url}")
    public String serverUrl;
    @Value("${keycloak.realm}")
    public String realm;
    @Value("${keycloak.resource}")
    public String clientId;
    @Value("${keycloak.credentials.secret}")
    public String clientSecret;

    private static Keycloak keycloak = null;

    public KeycloakProvider() {
    }

    public Keycloak getInstance() {
        if (keycloak == null) {

            return KeycloakBuilder.builder()
                    .realm(realm)
                    .serverUrl(serverUrl)
                    .clientId(clientId)
                    .clientSecret(clientSecret)
                    .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
                    .build();
        }
        return keycloak;
    }

    public KeycloakBuilder newKeycloakBuilderWithPasswordCredentials(
        String username,
        String password) {
        return KeycloakBuilder.builder()
                .realm(realm)
                .serverUrl(serverUrl)
                .clientId(clientId)
                .clientSecret(clientSecret)
                .username(username)
                .password(password);
    }

    public JsonNode refreshToken(String refreshToken) throws UnirestException {
        String url = serverUrl + "/realms/" + realm + "/protocol/openid-connect/token";
        return Unirest.post(url)
                .header("Content-Type", "application/x-www-form-urlencoded")
                .field("client_id", clientId)
                .field("client_secret", clientSecret)
                .field("refresh_token", refreshToken)
                .field("grant_type", "refresh_token")
                .asJson().getBody();
    }
}

我试着用Mockito来解决这个问题,但意识到它不会起作用,正如我所希望的那样。

EN

回答 1

Stack Overflow用户

发布于 2022-11-02 12:07:10

我自己解决它,而不是上面的代码,你应该写成那样,应该写@Autowired。

代码语言:javascript
运行
复制
@Autowired
KeycloakProvider kcProvider;
@Autowired
KeycloakAdminClientService kcAdminClientService;

它将解决所有的问题)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74280783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档