Je développe l'adaptateur dans le MFP V8. Voici mon code pour valider le nom d'utilisateur et mot de passe:Impossible d'initialiser l'objet AdaptersAPI dans l'adaptateur MobileFirst V8.0 qui mène à NullPointerException
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";
}
}
Lorsque je soumets la réponse défi que je reçois NullPointerException en ligne suivante:
HttpUriRequest httpUriRequest = adaptersAPI.createJavascriptAdapterRequest("LoginAndWeeklyCertAdapter1", "login");
parce adaptersAPI
est nulle. Dois-je faire une configuration supplémentaire pour que cela fonctionne? Comment puis-je initialiser l'objet AdaptersAPI
?
Remarque: La méthode de connexion et la vérification de sécurité sont toutes deux dans le même adaptateur.
Mise à jour
j'ai étudié plus de temps en elle et mis à jour le code ci-dessus et observé ce qui suit:
1. Quand validateCredentials()
devient appelé après le dépôt de la réponse de défi alors je J'obtiens la valeur null
dans l'objet AdapterAPI.
2. Où, lorsque j'appelle le getResourceData()
en utilisant l'outil swag mobilefirst alors je reçois un objet de AdapterAPI.
J'ai le problème exact, existe-t-il encore une solution? –
voir ma réponse ci-dessous. –