Spring 安全性在单元测试中正常工作,但在应用程序服务器(weblogic)中部署时不能正常工作

Spring 安全性在单元测试中正常工作,但在应用程序服务器(weblogic)中部署时不能正常工作,spring,rest,oauth,resttemplate,oauth-1.0a,Spring,Rest,Oauth,Resttemplate,Oauth 1.0a,有人能告诉我为什么这不起作用吗?当我从单元测试中运行代码时,它工作得非常好。安全设置完美,我们的服务就像我期望的那样出色 然而,当我将它部署到我们的应用服务器(weblogic)时,我的服务每次都会失败,因为我的令牌没有得到设置。每次调用我的send(final-ServiceAPInvoice invoice)方法时,我都会设置令牌,使其正常工作 我的问题是,在Weblogic环境中部署令牌时,为什么我的构造函数没有设置令牌?是什么导致了这个问题?OAuthSecurityContextHol

有人能告诉我为什么这不起作用吗?当我从单元测试中运行代码时,它工作得非常好。安全设置完美,我们的服务就像我期望的那样出色

然而,当我将它部署到我们的应用服务器(weblogic)时,我的服务每次都会失败,因为我的令牌没有得到设置。每次调用我的
send(final-ServiceAPInvoice invoice)
方法时,我都会设置令牌,使其正常工作

我的问题是,在Weblogic环境中部署令牌时,为什么我的构造函数没有设置令牌?是什么导致了这个问题?OAuthSecurityContextHolder是一个静态类。这会影响到我的问题吗?如果每次调用send方法时都设置令牌,是否仍会遇到问题?我还没有注意到任何问题,但还没有做任何负载测试

我使用的是Spring的OAuthRestTemplate(1.0),我需要设置一些不过期的令牌

这就是魔法发生的地方。我不得不稍微重命名代码以使其具有通用性,因此希望我没有任何打字错误:

public class ServiceRestTemplate {

private final OAuthRestTemplate serviceOAuthRestTemplate;

private final String apUri;

private final String arUri;

private final String tokenValue;

private final String tokenSecret;

public ServiceRestTemplate(final OAuthRestTemplate serviceOAuthRestTemplate,
                          final String apUri,
                          final String arUri,
                          final String tokenValue,
                          final String tokenSecret) {
    this.serviceOAuthRestTemplate = serviceOAuthRestTemplate;
    this.apUri = apUri;
    this.arUri = arUri;
    this.tokenSecret = tokenSecret;
    this.tokenValue = tokenValue;
    setContext(tokenValue, tokenSecret); // I expected this to be enough to setup my tokens 1 time
}

private void setContext(final String tokenValue, final String tokenSecret) {
    final OAuthConsumerToken accessToken = new OAuthConsumerToken();
    accessToken.setAccessToken(true);
    accessToken.setResourceId(serviceOAuthRestTemplate.getResource().getId());
    accessToken.setValue(tokenValue);
    accessToken.setSecret(tokenSecret);

    final OAuthSecurityContextImpl securityContext = new OAuthSecurityContextImpl();
    if (securityContext.getAccessTokens() == null) {
        securityContext.setAccessTokens(new HashMap<String, OAuthConsumerToken>());
    }
    if (!securityContext.getAccessTokens().containsKey(accessToken.getResourceId())) {
        securityContext.getAccessTokens().put(accessToken.getResourceId(), accessToken);
    }

    OAuthSecurityContextHolder.setContext(securityContext);
}

@Override
public ServiceWebResponse send(final ServiceAPInvoice invoice) {
    setContext(this.tokenValue, this.tokenSecret); // This line of code is the workaround to fixed my issue. 
    final ServiceWebResponse serviceResponse = serviceOAuthRestTemplate.postForObject(apUri,
                                                                                   invoice,
                                                                               ServiceWebResponse.class);
    return serviceResponse;
}
}
公共类ServiceRestTemplate{
专用最终OAuthRestTemplate服务OAuthRestTemplate;
私有最终字符串apUri;
阿鲁里私人酒店;
私有最终字符串标记值;
私有最终字符串令牌秘密;
公共服务RESTTemplate(最终OAuthRestTemplate服务OAuthRestTemplate,
最后一个字符串apUri,
最后一串阿鲁里,
最终字符串标记值,
最终字符串标记(机密){
this.serviceouthresttemplate=serviceouthresttemplate;
this.apUri=apUri;
this.arUri=arUri;
this.tokenSecret=tokenSecret;
this.tokenValue=tokenValue;
setContext(tokenValue,tokenSecret);//我希望这足以设置我的令牌1次
}
私有void setContext(最终字符串tokenValue,最终字符串tokenSecret){
最终OAuthConsumerToken accessToken=新的OAuthConsumerToken();
setAccessToken(true);
accessToken.setResourceId(serviceOAuthRestTemplate.getResource().getId());
accessToken.setValue(tokenValue);
accessToken.setSecret(tokenSecret);
最终OAuthSecurityContextImpl securityContext=新的OAuthSecurityContextImpl();
if(securityContext.getAccessTokens()==null){
setAccessTokens(新的HashMap());
}
如果(!securityContext.getAccessTokens().containsKey(accessToken.getResourceId())){
securityContext.getAccessTokens().put(accessToken.getResourceId(),accessToken);
}
setContext(securityContext);
}
@凌驾
公共服务WebResponse发送(最终服务发票){
setContext(this.tokenValue,this.tokenSecret);//这行代码是解决我的问题的方法。
最终ServiceWebResponse serviceResponse=serviceOAuthRestTemplate.postForObject(apUri,
发票,
ServiceWebResponse.class);
返回服务响应;
}
}