无法在MobileFirst V8.0适配器中初始化AdaptersAPI对象,这会导致NullPointerException [英] Unable to initialize AdaptersAPI Object in MobileFirst V8.0 adapter which is leading to NullPointerException
问题描述
我正在开发MFP V8中的适配器。下面是验证用户名和密码的代码:
I am developing the adapter in MFP V8. Below is my code to validate username and password:
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import com.ibm.mfp.adapter.api.AdaptersAPI;
import com.ibm.mfp.adapter.api.ConfigurationAPI;
import com.ibm.mfp.security.checks.base.UserAuthenticationSecurityCheck;
import com.ibm.mfp.server.registration.external.model.AuthenticatedUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
@Api(value = "Sample Adapter Resource")
@Path("/resource")
public class UserValidationSecurityCheck extends UserAuthenticationSecurityCheck{
private String displayName;
private String errorMsg;
private HashMap<String,Object> adapterReponse = null;
@Context
AdaptersAPI adaptersAPI;
@Override
protected AuthenticatedUser createUser() {
return new AuthenticatedUser(displayName, displayName, this.getName(),adapterReponse);
}
@Override
protected boolean validateCredentials(Map<String, Object> credentials) {
if(credentials!=null && credentials.containsKey("username") && credentials.containsKey("password")){
if (credentials.get("username")!=null && credentials.get("password")!=null) {
String username = credentials.get("username").toString();
String password = credentials.get("password").toString();
if (username.equals(password)) {
JSONObject loginParams = new JSONObject();
loginParams.put("username", username);
loginParams.put("password", password);
HttpUriRequest httpUriRequest = adaptersAPI.createJavascriptAdapterRequest("LoginAndWeeklyCertAdapter1", "login", loginParams);
try {
HttpResponse httpResponse = adaptersAPI.executeAdapterRequest(httpUriRequest);
adapterReponse = adaptersAPI.getResponseAsJSON(httpResponse);
System.out.println(adapterReponse.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
} else {
errorMsg = "Wrong Credentials";
}
}
}
else{
errorMsg = "Credentials not set properly";
}
return false;
}
public boolean isLoggedIn(){
return getState().equals(STATE_SUCCESS);
}
public AuthenticatedUser getRegisteredUser() {
return registrationContext.getRegisteredUser();
}
@Override
protected Map<String, Object> createChallenge() {
Map<String, Object> challenge = new HashMap<String, Object>();
challenge.put("errorMsg", errorMsg);
challenge.put("remainingAttempts", getRemainingAttempts());
return challenge;
}
@ApiOperation(value = "Returns 'Hello from resource'", notes = "A basic example of a resource returning a constant string.")
@ApiResponses(value = { @ApiResponse(code = 200, message = "Hello message returned") })
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getResourceData() {
// log message to server log
logger.info("Logging info message...");
return "Hello from resource";
}
}
当我提交质询答案时我在下面的行中得到NullPointerException:
When I am submitting the challenge answer I am getting NullPointerException in following line:
HttpUriRequest httpUriRequest = adaptersAPI.createJavascriptAdapterRequest("LoginAndWeeklyCertAdapter1", "login");
因为 adaptersAPI
为空。我是否必须进行任何额外配置才能使其正常工作?如何初始化 AdaptersAPI
对象?
because adaptersAPI
is null. Do I have to do any extra configuration in order to make that work? How can I initialize AdaptersAPI
object?
注意:登录方法和安全性检查两者是否在同一个适配器中。
Note: The login method and the security check both are in same adapter.
更新
我调查了更多时间进入并更新上面给出的代码并观察以下内容:
I investigated more of time into it and updated the code to given above and observed the following:
1。当 validateCredentials()
在提交质询响应后被调用,然后我在AdapterAPI对象中获得 null
值。
1. When validateCredentials()
is getting called after submitting the challenge response then I am getting null
value in AdapterAPI object.
2. 当我使用mobilefirst swagger工具调用 getResourceData()
时,我得到了一个AdapterAPI对象。
2. Where as, when I am calling the getResourceData()
using the mobilefirst swagger tool then I am getting an object of AdapterAPI.
推荐答案
我们无法将适配器API注入安全检查对象
(按设计 - 不是错误)。我们唯一能做的就是从Adapter中将逻辑提取到Java代码中,而不使用适配器API。
We cannot inject the adapters API into a security check object
(by design - not a bug). The only way we can go is to extract the logic from Adapter into a Java code, without using adapters API.
这篇关于无法在MobileFirst V8.0适配器中初始化AdaptersAPI对象,这会导致NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!