Spring Boot集成Dynamics CRM API:添加额外令牌请求资源配置方法
在Spring Boot中配置CRM API的令牌请求(含resource参数)
方式一:手动构建令牌请求(RestTemplate)
如果不需要依赖Spring Security的OAuth2自动配置,可以直接用RestTemplate发送POST请求获取令牌,手动传入所需的键值对参数:
- 配置RestTemplate Bean(项目未配置时添加):
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
- 编写令牌获取方法,在请求体中包含
resource及其他必填参数:
@Service public class CrmTokenService { private final RestTemplate restTemplate; @Value("${crm.token.url}") private String tokenUrl; @Value("${crm.client.id}") private String clientId; @Value("${crm.client.secret}") private String clientSecret; @Value("${crm.resource}") private String resource; // 对应xyz-dynamics.com public CrmToken getToken() { MultiValueMap<String, String> params = new LinkedMultiValueMap<>(); params.add("grant_type", "client_credentials"); params.add("client_id", clientId); params.add("client_secret", clientSecret); params.add("resource", resource); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers); ResponseEntity<CrmToken> response = restTemplate.postForEntity(tokenUrl, request, CrmToken.class); return response.getBody(); } // 令牌响应实体类 public static class CrmToken { private String access_token; private String token_type; private long expires_in; // getter、setter方法省略 } }
- 在
application.properties中配置参数:
crm.token.url=https://your-crm-token-endpoint.com/oauth2/token crm.client.id=your-client-id crm.client.secret=your-client-secret crm.resource=xyz-dynamics.com
方式二:使用Spring Security OAuth2 Client自动配置
如果项目已集成Spring Security OAuth2,可通过配置ClientCredentialsResourceDetails自动处理令牌请求:
- 添加Spring Security OAuth2依赖(Maven示例):
<dependency> <groupId>org.springframework.security.oauth</groupId> <artifactId>spring-security-oauth2</artifactId> <version>2.5.2.RELEASE</version> </dependency>
- 配置OAuth2客户端详情:
@Configuration @EnableOAuth2Client public class OAuth2Config { @Value("${crm.token.url}") private String tokenUrl; @Value("${crm.client.id}") private String clientId; @Value("${crm.client.secret}") private String clientSecret; @Value("${crm.resource}") private String resource; @Bean public ClientCredentialsResourceDetails crmResourceDetails() { ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails(); details.setAccessTokenUri(tokenUrl); details.setClientId(clientId); details.setClientSecret(clientSecret); // 将resource参数添加到请求体 details.setAdditionalParameters(Map.of("resource", resource)); return details; } @Bean public OAuth2RestTemplate crmRestTemplate(OAuth2ClientContext oauth2ClientContext) { return new OAuth2RestTemplate(crmResourceDetails(), oauth2ClientContext); } }
配置完成后,直接使用crmRestTemplate发送CRM API请求即可,它会自动获取并携带令牌。
注意事项
- 确认令牌端点支持
application/x-www-form-urlencoded格式的请求体,这是OAuth2客户端凭证模式的标准格式。 - 可根据实际令牌响应结构调整
CrmToken实体类的字段。 - 建议添加令牌缓存逻辑,减少对令牌端点的重复请求。
内容的提问来源于stack exchange,提问作者Ashrin Jose
相关产品推荐
相关产品推荐

