2017-04-26 4 views
1

Google App Engine에 앱을 배포하고 사용자가 웹에서 POST를 사용하여 액세스 할 수있게하려고합니다. 내가 알고있는 것처럼 com.mysql.jdbc.GoogleDriver은 GAE에서 배포되는 동안 만 작동합니다. 따라서 GAE에 배포 한 후에는 매번 시도해 보겠습니다. 불행히도, 나는 항상 답장의 오류 부분을받습니다. 이것이 Google Cloud SQL과의 연결에 문제가 있다고 생각합니다.Google App Engine에서 작동하지 않는 Google SQL

<?xml version="1.0" encoding="utf-8"?> 
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> 

<!-- 
Allows App Engine to send multiple requests to one instance in parallel: 
--> 
<threadsafe>true</threadsafe> 
<use-google-connector-j>true</use-google-connector-j> 
<system-properties> 
<property name="ae-cloudsql.cloudsql-database-url" value="jdbc:google:mysql://${INSTANCE_CONNECTION_NAME}/${database}?user=${user}&amp;password=${password}" /> 
</system-properties> 

<!-- 
HTTP Sessions are disabled by default. To enable HTTP sessions specify: 

    <sessions-enabled>true</sessions-enabled> 

It's possible to reduce request latency by configuring your application to 
asynchronously write HTTP session data to the datastore: 

    <async-session-persistence enabled="true" /> 

With this feature enabled, there is a very small chance your app will see 
stale session data. For details, see 
https://cloud.google.com/appengine/docs/java/config/appconfig#Java_appengine_web_xml_Enabling_sessions 
--> 

</appengine-web-app> 

web.xml을

@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
@POST 
@Path("/v3") 
public Response getSAppData(AppDataRequest adr) { 
    Response data = ads.getSAppData(adr.getId(), adr.getEmail(), adr.getPassword()); 
    return data; 
} 

POST 코드

public class AppDataService { 
Map<AppDataRequest, Data> DataHM = new HashMap<>(); 

static final String JDBC_DRIVER = "com.mysql.jdbc.GoogleDriver"; 
static final String DB_URL = "jdbc:google:mysql://****:****/****?user=root"; 

static final String USER = "****"; 
static final String PASS = "****"; 

public AppDataService(){ 
    Connection conn = null; 
    Statement stat = null; 
    try{ 
     Class.forName("com.mysql.jdbc.GoogleDriver"); 
     conn = DriverManager.getConnection(DB_URL); 
     stat = conn.createStatement(); 
     String sql = "SELECT * FROM testdata"; 
     ResultSet resu = stat.executeQuery(sql); 
     while(resu.next()){ 
      int id = resu.getInt("app_id"); 
      String email = resu.getString("email"); 
      String password = resu.getString("password"); 
      String token = resu.getString("token"); 
      DataHM.put(new AppDataRequest(id, email, password), new Data(token)); 
     } 
     resu.close(); 
     stat.close(); 
     conn.close(); 
    } 
    catch(SQLException se){ 
     se.printStackTrace(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    finally{ 
     try{ 
      if(stat!=null){ 
       stat.close(); 
      } 
     } 
     catch (SQLException se2){ 
      se2.printStackTrace(); 
     } 
     try{ 
      if(conn!=null){ 
       conn.close(); 
      } 
     } 
     catch(SQLException se3){ 
      se3.printStackTrace(); 
     } 
    }    
} 

public Response getSAppData(int id, String email, String password){ 
    Map<String, AppData> AppDataHM = new HashMap<>(); 
    Map<String, Data> DataHM1 = new HashMap<>(); 
    Map<String, List<String>> DataHM2 = new HashMap<>(); 
    HashMap<Object, Object> ADHMDHM = new HashMap<>(); 

    List<String> message = new ArrayList<>(); 
    Data data = DataHM.get(new AppDataRequest (id, email, password)); 
    List<String> data2 = new ArrayList<>(); 

    if(data != null){ 
     message.add(""); 
     AppDataHM.put("AppData", new AppData("success", message)); 
     DataHM1.put("Data", data); 
     ADHMDHM.putAll(AppDataHM); 
     ADHMDHM.putAll(DataHM1); 
     String ADHMDHM1 = new Gson().toJson(ADHMDHM); 
     return Response.status(200).entity(ADHMDHM1).build(); 
    } 
    else{ 
     message.add("Your login information is invalid. Please try with the correct information"); 
     AppDataHM.put("AppData", new AppData("error", message)); 
     DataHM2.put("Data", data2); 
     ADHMDHM.putAll(AppDataHM); 
     ADHMDHM.putAll(DataHM2); 
     String ADHMDHM2 = new Gson().toJson(ADHMDHM); 
     return Response.status(200).entity(ADHMDHM2).build(); 
     } 
    } 
} 

코드 구글 SQL

Jar Files

항아리 파일에 액세스 이 질문에 대답하는 데 도움이 모든 사용자에 대해 사전에 우편 배달부

감사를 사용Return from the GAE

GAE 돌아갑니다.

+0

아마도'DriverManager.getConnection (String url, String user, String password)'를 사용해야 할 것입니다. 현재 URL에 사용자 이름 (약간 이상한) 만 제공하고 비밀번호는 제공하지 않습니다. –

+0

안녕하세요. @MarkRotteveel 앱을 Google App Engine에 배포하기 전에 'DriverManager.getConnection (String url, String user, String password)'가 작동하지만 배포 후에는 작동하지 않으며 [여기] (http : /stackoverflow.com/a/20173117/7772730) 자세한 정보는 암호를 설정하지 않고 루트 계정을 사용하기 때문에 사용자 이름 만 제공합니다. –

답변

1

루벤. Google Cloud SQL URL에 인스턴스 연결 이름 대신 인스턴스 ID를 사용하고 있기 때문에 코드가 작동하지 않는 것 같습니다. 귀하의 Web.XML은 귀하가 사용하고 있다고 나타냅니다 ${INSTANCE_CONNECTION_NAME}<property name="ae-cloudsql.cloudsql-database-url" value="jdbc:google:mysql://${INSTANCE_CONNECTION_NAME}/${database}?user=${user}&amp;password=${password}" />

에서 확인할 수 있습니다.

관련 문제