Lotus Notes中的Java代理程序“java.security.AccessControlException”异常

时间:2016-02-01 17:00:43

标签: java lotus-notes javaagents

我正在尝试使用Google自定义搜索API,显然是在谷歌搜索。我在Lotus Notes中创建了这个Java代理。

主要类别:

import java.util.List;
import lotus.domino.AgentBase;
import com.google.api.services.customsearch.model.Result;
public class JavaAgent extends AgentBase {
    public void NotesMain() {
        GoogleSearchClient gsc = new GoogleSearchClient();
        String searchKeyWord = "test";
        List<Result> resultList =    gsc.getSearchResult(searchKeyWord);
        if(resultList != null && resultList.size() > 0){
            for(Result result: resultList){
                System.out.println(result.getHtmlTitle());
                System.out.println(result.getFormattedUrl());
                System.out.println("----------------------------------------");
            }
        }
    }
}

这就是GoogleSearchClient类:

import java.util.Collections;
import java.util.List;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.services.customsearch.Customsearch;
import com.google.api.services.customsearch.model.Result;
import com.google.api.services.customsearch.model.Search;
public class GoogleSearchClient {
    public List<Result> getSearchResult(String keyword){
        String GOOGLE_SEARCH_URL = https://www.googleapis.com/customsearch/v1?";
        //api key
        String API_KEY = "xxxxxxxxxxxxxxxxxxxxx";
        //custom search engine ID
        String SEARCH_ENGINE_ID = "xxxxxxxxxx:xxxxxxxxxxxx";
        String FINAL_URL= GOOGLE_SEARCH_URL + "key=" + API_KEY + "&cx=" + SEARCH_ENGINE_ID;
        // Set up the HTTP transport and JSON factory
        HttpTransport httpTransport = new NetHttpTransport();
        JsonFactory jsonFactory = new com.google.api.client.json.jackson2.JacksonFactory();
        //HttpRequestInitializer initializer = (HttpRequestInitializer)new CommonGoogleClientRequestInitializer(API_KEY);
        Customsearch customsearch = new Customsearch(httpTransport, jsonFactory,null);

        List<Result> resultList = Collections.emptyList();
        try {
            Customsearch.Cse.List list = customsearch.cse().list(keyword);
            list.setKey(API_KEY);
            list.setCx(SEARCH_ENGINE_ID);
            //num results per page
            //list.setNum(2L);

            //for pagination
            list.setStart(10L);
            Search results = list.execute();
            resultList = results.getItems();

        }catch (Exception e) {
            e.printStackTrace();
        }
        return resultList;
    }
}

我有代码here

这让我觉得这个例外:

java.security.AccessControlException: Access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)
    at java.security.AccessController.throwACE(AccessController.java:100)
    at java.security.AccessController.checkPermission(AccessController.java:174)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:544)
    at COM.ibm.JEmpower.applet.AppletSecurity.superDotCheckPermission(AppletSecurity.java:1449)
    at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1617)
    at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
    at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:118)
    at com.google.api.client.util.FieldInfo.of(FieldInfo.java:97)
    at com.google.api.client.util.ClassInfo.<init>(ClassInfo.java:172)
    at com.google.api.client.util.ClassInfo.of(ClassInfo.java:90)
    at com.google.api.client.util.GenericData.<init>(GenericData.java:79)
    at com.google.api.client.util.GenericData.<init>(GenericData.java:61)
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.<init>(AbstractGoogleClientRequest.java:109)
    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.<init>(AbstractGoogleJsonClientRequest.java:57)
    at com.google.api.services.customsearch.CustomsearchRequest.<init>(CustomsearchRequest.java:43)
    at com.google.api.services.customsearch.Customsearch$Cse$List.<init>(Customsearch.java:178)
    at com.google.api.services.customsearch.Customsearch$Cse.list(Customsearch.java:154)
    at GoogleSearchClient.getSearchResult(Unknown Source)
    at JavaAgent.NotesMain(Unknown Source)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(Unknown Source)

我在互联网上挖掘了这个例外,我明白JVM并不认为我拥有特权并尝试了一些东西。

  1. 我在本地计算机和服务器的“Java.policy”存档中添加了以下权限,但它不起作用。

    grant { permission java.util.PropertyPermission "http.keepAlive", "read, write"; };
    grant { permission java.security.AllPermission; } 
    
  2. 我会尝试this,但我的软件版本是9。

  3. 我在Eclipse中尝试了相同的代码并且它运行得很好,所以我认为这是一个错误的Notes安全配置。我必须在Lotus Notes中执行,因为我必须在表单等中保存信息。

  4. 我将运行时安全级别更改为3(允许具有完全管理权限的受限操作)

  5. 我有什么想法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

当我在Lotus中为我的Web服务使用者开发WS-Security时,我遇到了同样的错误。我发现我可以在.jar文件中使用AccessController.doPrivileged方法来避免这种情况。因此,您需要在IDE中创建单独的.jar并在Lotus Agent中使用它 以下是将AccessController.doPrivileged与您的代码一起使用的示例:

import java.util.Collections;
import java.util.List;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.services.customsearch.Customsearch;
import com.google.api.services.customsearch.model.Result;
import com.google.api.services.customsearch.model.Search;
public class GoogleSearchClient {
    public List<Result> getSearchResult(final String keyword){
        String GOOGLE_SEARCH_URL = https://www.googleapis.com/customsearch/v1?";
        //api key
        final String API_KEY = "xxxxxxxxxxxxxxxxxxxxx";
        //custom search engine ID
        final String SEARCH_ENGINE_ID = "xxxxxxxxxx:xxxxxxxxxxxx";
        String FINAL_URL= GOOGLE_SEARCH_URL + "key=" + API_KEY + "&cx=" + SEARCH_ENGINE_ID;
        // Set up the HTTP transport and JSON factory
        HttpTransport httpTransport = new NetHttpTransport();
        JsonFactory jsonFactory = new com.google.api.client.json.jackson2.JacksonFactory();
        //HttpRequestInitializer initializer = (HttpRequestInitializer)new CommonGoogleClientRequestInitializer(API_KEY);
        final Customsearch customsearch = new Customsearch(httpTransport, jsonFactory,null);

        return AccessController.doPrivileged(
                new PrivilegedAction<List<Result>>() {
            @Override
            public List<Result> run() {
                List<Result> resultList = Collections.emptyList();
                try {
                    Customsearch.Cse.List list = customsearch.cse().list(keyword);
                    list.setKey(API_KEY);
                    list.setCx(SEARCH_ENGINE_ID);
                    //num results per page
                    //list.setNum(2L);

                    //for pagination
                    list.setStart(10L);
                    Search results = list.execute();
                    resultList = results.getItems();

                }catch (Exception e) {
                    e.printStackTrace();
                }
                return resultList;
            }
        });
    }
}