2016-07-25 1 views
2

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.

+0

J'ai le problème exact, existe-t-il encore une solution? –

+0

voir ma réponse ci-dessous. –

Répondre

3

Nous cannot inject the adapters API into a security check object (par conception - pas un bug). La seule façon de procéder est d'extraire la logique de l'adaptateur dans un code Java, sans utiliser l'API des adaptateurs.