0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Spring RestTemplate + KeyCloak + Json To Object Mapping

Posted at

前提

KeycloakへSpring Rest Template を使ってどうこうする例。

Postして、結果JSONをObjectに詰めたい。

RestTemplate Bean定義

    @Bean
    public RestTemplate restTemplate() {
        var restTemplate = new RestTemplate();
        HttpMessageConverter<?> formHttpMessageConverter = new FormHttpMessageConverter();

        restTemplate.getMessageConverters().add(formHttpMessageConverter);
        restTemplate.getMessageConverters().add(getMappingJackson2HttpMessageConverter());
        return restTemplate;
    }

    public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
        return mappingJackson2HttpMessageConverter;
    }

FormHttpMessageConverter

Content-Type:application/x-www-form-urlencodedの対応。

MappingJackson2HttpMessageConverter

Content-Type:application/jsonの対応。

受け取り用DTO

TokenResponseDto.java

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class TokenResponseDto {
    @Getter
    @JsonProperty("access_token")
    private String accessToken;
    @Getter
    @JsonProperty("expires_in")
    private Integer expiresIn;
    @Getter
    @JsonProperty("refresh_expires_in")
    private Integer refreshExpiresIn;
    @Getter
    @JsonProperty("refresh_token")
    private String refreshToken;
    @Getter
    @JsonProperty("token_type")
    private String tokenType;
    @Getter
    @JsonProperty("not-before-policy")
    private Integer notBeforePolicy;
    @Getter
    @JsonProperty("session_state")
    private String sessionState;
    @Getter
    @JsonProperty("scope")
    private String scope;
}

@Valueをつけたかったが、Jacksonが動かなそうだったので、@Getterで。

呼び出し

	URI uri = new DefaultUriBuilderFactory().builder()
		.scheme("http")
		.host("192.168.1.31")
		.port(8083)
		.path("auth/realms/Test/protocol/openid-connect/token")
		.build();
	MultiValueMap<String,String> request = new LinkedMultiValueMap<>(){{
		add("grant_type", "authorization_code");
		add("code", code);
		add("redirect_uri", "http://localhost:7000/login");
		add("client_id", "test");
	}};
	RequestEntity<MultiValueMap<String, String>> requestEntity = RequestEntity.post(uri)
		.contentType(MediaType.APPLICATION_FORM_URLENCODED)
		.accept(MediaType.APPLICATION_JSON)
		.body(request);
        ResponseEntity<TokenResponseDto> ret = restTemplate.postForEntity(uri, requestEntity, TokenResponseDto.class);

ポイント

FormHttpMessageConverterは、MultiValueMapインタフェースベース。Mapじゃだめ。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?