无法在MobileFirst V8.0适配器中初始化AdaptersAPI对象,这会导致NullPointerException [英] Unable to initialize AdaptersAPI Object in MobileFirst V8.0 adapter which is leading to NullPointerException

查看:181
本文介绍了无法在MobileFirst V8.0适配器中初始化AdaptersAPI对象,这会导致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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆