0

我以前看过这个问题,但似乎找不到可靠的解决方案。截至目前,Google App Engine 不支持 java.util.logging.Logger 的子类。我在使用 Base CRM API(此处的信息: https ://github.com/basecrm/basecrm-java )将联系人输入到我的 CRM的 java 端点中有一些代码。在 locahost 环境中使用它进行测试时,这可以按预期工作,但是一旦部署它就不喜欢 Base API 正在执行的日志记录。这是我从 GAE 得到的错误:

java.lang.SecurityException: Google App Engine does not support subclasses of java.util.logging.Logger: com/getbase/http/jersey/HttpClient$Slf4jAdapter
    at com.google.appengine.runtime.Request.process-bbdc1f6d27729bc9(Request.java)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:375)
    at com.getbase.http.jersey.HttpClient.<init>(HttpClient.java:31)
    at com.getbase.Client.<init>(Client.java:34)
    at com.nicholas.leadsbackend.LeadsServlet.sendToBase(LeadsServlet.java:90)
    at com.nicholas.leadsbackend.LeadsServlet.doPost(LeadsServlet.java:61)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:453)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:460)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:293)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:319)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:311)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:457)
    at java.lang.Thread.run(Thread.java:745)

这是我的端点中发送到基础的代码:

Client client = new Client(new Configuration.Builder()
                    .accessToken(BASECRM_ACCESS_TOKEN)
                    .verbose()
                    .build());

            Contact contact = new Contact();
            contact.setName(name);
            contact.setPhone(phone);
            contact.setEmail(email);
            contact.setDescription("Make/Model/Year: " + make + "\n" +
                    "Type of Ad: " + adType);
            client.contacts().create(contact);

API 代码是非常简单的代码,这里不是问题。我的问题是 CRM API 需要此依赖项compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.21'才能正常工作,否则会引发错误。

请让我知道是否有任何方法可以为 GAE 解决此问题。我正在寻找除 GAE 之外的其他选项,因为其他选项可能没有严格的日志记录规则。我知道这也是一种特殊情况,因为它是导致我出现问题的额外 API,但任何见解都会非常有帮助。提前致谢!

4

1 回答 1

0

我知道这是一个非常具体的问题,我正在与 Base 开发人员支持部门合作寻找 SFL4j 日志记录的解决方法。所以我清理了 Base Java API,发现只有一个类创建了 sfj4j 适配器的子类。这是对他们 API 的更新,不确定他们何时合并此更新,因此我决定使用较旧的 API,然后是他们在文档中列出的 API。

这是一个库库提供使用:编译"com.getbase:basecrm-java:1.4.5"

其中有这个类:

public static class Slf4jAdapter extends java.util.logging.Logger {
        private final Logger logger;

        public Slf4jAdapter(Logger logger) {
            super("jersey", null);
            this.logger = logger;
        }

        @Override
        public void info(String msg) {
            logger.info(msg);
        }
    }

那是 java.util Logger 的子类。

我最终使用了这个库:compile "com.getbase:basecrm-java:1.0.0"

这是在他们开始使用 sfl4j 日志记录之前。这使得 Google App Engine 没有拒绝我的请求,现在一切正常。

我不确定他们开始使用 sfl4j 的哪个版本,但我会找出来,这样我就可以在没有 sfl4j 的情况下使用最新的 getbase 构建。

在确定是否有 sfl4j 日志记录的解决方法或在没有它的情况下显示最新版本后,我将编辑此答案。我希望这对其他人有帮助。

于 2017-04-12T23:24:24.197 回答