在MobileFirst 8 Java适配器之间传递数据

在MobileFirst 8 Java适配器之间传递数据,java,ibm-mobilefirst,mobilefirst-adapters,Java,Ibm Mobilefirst,Mobilefirst Adapters,如何在经过身份验证的用户的MobileFirst8Java适配器之间传递数据,我尝试使用 public void putInUserSession(String key, String value, AdapterSecurityContext securityContext) { if (securityContext != null && securityContext.getAuthenticatedUser() != null) {

如何在经过身份验证的用户的MobileFirst8Java适配器之间传递数据,我尝试使用

public void putInUserSession(String key, String value, AdapterSecurityContext securityContext) {
        if (securityContext != null && securityContext.getAuthenticatedUser() != null) {
            Map<String, Object> hashMap = securityContext.getAuthenticatedUser().getAttributes();
            hashMap.put(key, value);
        }

    }
public void putInUserSession(字符串键、字符串值、适配器安全上下文安全上下文){
if(securityContext!=null&&securityContext.getAuthenticatedUser()!=null){
Map hashMap=securityContext.getAuthenticatedUser().getAttributes();
hashMap.put(键、值);
}
}

但是hashMap.put抛出“不可修改的映射”异常

在保存属性之前,请分享您是如何设置属性的

以下是在UserLogin安全类的
受保护的AuthenticatedUser createUser()
函数中设置属性的方法之一:

private Map<String, Object> attributes = new HashMap<String, Object>();
 //Here put or save values in attributes   
 @Override
    protected AuthenticatedUser createUser() {
        return new AuthenticatedUser(userId, displayName, this.getName(),attributes);
    }
private Map attributes=new HashMap();
//在这里,在属性中放置或保存值
@凌驾
受保护的AuthenticatedUser createUser(){
返回新的AuthenticatedUser(userId,displayName,this.getName(),attributes);
}
我猜hashMap.put抛出“不可修改映射”异常的原因之一是因为hashMap的类型为
Map
,并且您正在保存
Map
类型的值,这是不可能的。
您需要将
Map
转换为
Map
,然后保存。

因为MFP 8.0会话是无状态的。(即)不能将数据存储到http会话中。您需要借助其他机制来存储会话数据。请参考这里的讨论

知识中心记录此场景和解决方案。对于7.1,这会影响会话独立模式。在8.0以后的版本中,会话独立模式是唯一受支持的模式,您应该这样做

在Java RESTful适配器中保存请求之间的应用程序状态

在V7.1.0之前的版本中,开发人员可以使用会话对象,即request.getSession()(请参见WL.Server),将应用程序状态存储在HTTP会话中

如果您使用的是独立于会话的独立模式,从IBM MaBiLe1.1平台Fas1.V7.1.0开始,适配器的应用状态必须在会话之外持久使用,例如,使用诸如CyrOuts®

之类的数据库。
示例也附在上面的链接中。

由于MFP8不允许在会话中从适配器写入数据,我们可以使用下面的方法实现该功能

  • 创建一个Java适配器,比如说“自定义会话”
  • 创建HashMap>
  • 父hashMap的密钥将是您的“访问令牌”
  • 子hashMap将以键值对的形式存储您想要存储的数据
  • 添加计划程序以清理已结束会话的父hashMap

  • 因此,我们可以创建自己的自定义方法来实现So

    1。你能告诉我你想储存什么样的信息,以及你希望它能持续多久吗?2.您是否尝试在中使用findClientRegistrationData()/storeClientRegistrationData()“我仅尝试存储字符串”,并且信息将一直存储到用户会话可用为止。基本上,当用户使用应用程序时,我试图在会话中添加信息(而不是使用安全检查)。当我使用“AuthenticatedUser(userId,displayName,name,Map)”在会话中使用Map保存信息时,由于映射不可修改,我无法存储信息,然后在编译时只能获取不兼容的类型:无法将类型对象的映射转换为StringUse映射以在会话中保存信息。必须传递类型映射的属性,否则您将得到您提到的错误。是的,我正在使用相同的类型,并且工作正常,我的要求是在会话中存储来自Java适配器的一些数据(不是来自安全测试)MFP 8.0会话是无状态的。这意味着,您不能将数据存储到http会话中。您需要借助其他机制来存储会话数据。您的意思是我们不能使用MFP 8在Java适配器的会话中存储数据吗?是的,因为MFP8中默认且唯一受支持的模式是会话独立模式。并且任何特定于适配器的数据都必须是persi例如,通过使用Cloudant®之类的数据库在会话之外进行测试。有关基于Cloudant的示例,请参阅我回答中的链接。