2017-04-10 67 views
0

我見過這個問題之前詢問周圍,似乎無法找到一個堅實的解決方案。截至目前,Google App Engine不支持java.util.logging.Logger的子類。我在使用Base CRM API的Java終端中有一些代碼(info here:https://github.com/basecrm/basecrm-java)將聯繫人輸入到我的CRM中。這可以在locahost環境中使用它進行測試時按預期工作,但是它的部署並不像Base API正在進行的日誌記錄。下面是我從GAE得到的錯誤:谷歌應用程序引擎Java日誌記錄,特別是Slf4j

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導致我的問題,但任何見解都會非常有幫助。提前致謝!

回答

0

我知道這是一個非常特殊的問題,我正在與Base開發人員支持人員一起尋找SFL4j日誌記錄的解決方法。所以我已經清理了Base Java API來查找只有一個類創建了sfj4j Adapter的子類。這是對其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中記錄儀的子類。

我結束了使用這個庫:compile "com.getbase:basecrm-java:1.0.0"

他們開始使用sfl4j記錄之前先進行。這使得Google App Engine不會拒絕我的請求,現在一切正在進行。

我不確定他們開始使用sfl4j的哪個版本,但我打算查明,所以我可以使用最新的getbase構建而不使用sfl4j。

我會在找出是否有解決方法來解決sfl4j日誌記錄或在沒有它的情況下顯示最新的內部版本之後編輯此答案。我希望這可以對其他人有所幫助。