在环境变量中获取null

时间:2018-09-11 05:38:03

标签: java spring spring-mvc spring-data-jpa

@Configuration  
public class CustomRemoteTokenService implements ResourceServerTokenServices {

    private static final Logger logger = LoggerFactory.getLogger(CustomRemoteTokenService.class);

    @Resource
    Environment environment;

    private RestOperations restTemplate;

    private String checkTokenEndpointUrl;

    private String clientId;

    private String clientSecret;

    private String tokenName = "token";

    private AccessTokenConverter tokenConverter = new DefaultAccessTokenConverter();

    @Autowired
    public CustomRemoteTokenService() {
        restTemplate = new RestTemplate();
        ((RestTemplate) restTemplate).setErrorHandler(new DefaultResponseErrorHandler() {
            @Override
            // Ignore 400
            public void handleError(ClientHttpResponse response) throws IOException {
                if (response.getRawStatusCode() != 400
                        && response.getRawStatusCode() != 403 /* && response.getRawStatusCode() != 401 */) {
                    super.handleError(response);
                }
            }
        });
    }

    public void setRestTemplate(RestOperations restTemplate) {
        this.restTemplate = restTemplate;
    }

    public void setCheckTokenEndpointUrl(String checkTokenEndpointUrl) {
        this.checkTokenEndpointUrl = checkTokenEndpointUrl;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }

    public void setClientSecret(String clientSecret) {
        this.clientSecret = clientSecret;
    }

    public void setAccessTokenConverter(AccessTokenConverter accessTokenConverter) {
        this.tokenConverter = accessTokenConverter;
    }

    public void setTokenName(String tokenName) {
        this.tokenName = tokenName;
    }

    @Override
    public OAuth2Authentication loadAuthentication(String accessToken)
            throws AuthenticationException, InvalidTokenException, GenericException {

        /*
         * This code needs to be more dynamic. Every time an API is added we have to add
         * its entry in the if check for now. Should be changed later.
         */
        HttpServletRequest request = Context.getCurrentInstance().getRequest();
        MultiValueMap<String, String> formData = new LinkedMultiValueMap<String, String>();
        formData.add(tokenName, accessToken);
        formData.add("api", environment.getProperty("resource.api"));  
       /* formData.add("api", "5b64018880999103244f1fdd");*/

        HttpHeaders headers = new HttpHeaders();
        headers.set("Authorization", getAuthorizationHeader(clientId, clientSecret));
        Map<String, Object> map = null;
        try {
            map = postForMap(checkTokenEndpointUrl, formData, headers);
        } catch (ResourceAccessException e) {
            logger.error("Socket Exception occured at " + System.currentTimeMillis() + "for client_id :  " + clientId);

            GenericException ge = new GenericException(
                    "Could not validate your access token. If this occurs too often please contact MapmyIndia support at apisupport@mapmyindia.com");
            ge.setHttpErrorCode(504);
            ge.setOauthError("Access Token validation failed");
            throw ge;
        }

        if (map.containsKey("error")) {
            logger.error("check_token returned error: " + map.get("error") + " for client id : " + clientId);
            String temp = map.get("error").toString();
            GenericException ge = new GenericException(map.get("error_description").toString());
            ge.setHttpErrorCode(Integer.parseInt(map.get("responsecode").toString()));
            ge.setOauthError(temp);

            switch (temp) {
                case "invalid_token":
                    throw new InvalidTokenException(accessToken);
                default:
                    throw ge;
            }
        }

        Assert.state(map.containsKey("client_id"), "Client id must be present in response from auth server");
        return tokenConverter.extractAuthentication(map);
    }

    @Override
    public OAuth2AccessToken readAccessToken(String accessToken) {
        throw new UnsupportedOperationException("Not supported: read access token");
    }

    private String getAuthorizationHeader(String clientId, String clientSecret) {
        String creds = String.format("%s:%s", clientId, clientSecret);
        try {
            return "Basic " + new String(Base64.encode(creds.getBytes("UTF-8")));
        } catch (UnsupportedEncodingException e) {
            throw new IllegalStateException("Could not convert String");
        }
    }

    private Map<String, Object> postForMap(String path, MultiValueMap<String, String> formData, HttpHeaders headers)
            throws RestClientException {
        if (headers.getContentType() == null) {
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        }
        @SuppressWarnings("rawtypes")
        Map map = restTemplate.exchange(path, HttpMethod.POST,
                new HttpEntity<MultiValueMap<String, String>>(formData, headers), Map.class).getBody();
        @SuppressWarnings("unchecked")
        Map<String, Object> result = map;
        return result;
    }
}
  1. Environment自动接线并在null时得到environment.getProperty("resource.api");

  2. 它总是返回null,但是在另一个类中,我自动连接Environment并成功地从属性中检索值。

1 个答案:

答案 0 :(得分:0)

您必须执行以下步骤:

1。注册属性

您需要通过@PropertySource("classpath:foo.properties")将属性文件注册为:

@Configuration
@PropertySource("classpath:foo.properties")
public class CustomRemoteTokenService implements ResourceServerTokenServices  {
    //...
}

2。注入属性

要使用Environment API获取属性的值:

@Autowired
private Environment env;