Создание внутреннего API Java RESTful, которое будет взаимодействовать с базой данных, хранящейся в облаке - PullRequest
0 голосов
/ 26 сентября 2018

В настоящее время я изучаю Java EE, и меня попросили разработать бэкэнд RESTful Java API, который будет взаимодействовать с базой данных, хранящейся в облачном решении (IBM Bluemix).

В настоящее время я использую Eclipse Photon в качестве IDEи я не являюсь пользователем-администратором на компьютере.

Меня попросили проверить мой код с помощью подключаемого модуля сервера IBM Was Liberty для затмения, но у меня возникли некоторые проблемы при настройке сервера.Я думаю, что, возможно, я не понял, как работает плагин, и не могу заставить его работать так, как я хочу.

Проблема в том, что я не могу получить доступ к базе данных, хранящейся на этом сервере, будь то с моимAPI или административный центр (даже не могу войти в административный центр).

Вот код Java, который я использую (модифицированный) и найденный на этом сайте

package connection;

//STEP 1. Import required packages
import java.sql.*;

public class FirstExample {
 // JDBC driver name and database URL
 static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
 static final String DB_URL = "jdbc:mysql://localhost:3306/ibm/api/validator/dataSource/SAMPLEDB";
 //  Database credentials
 static final String USER = "admin";
 static final String PASS = "admin";

 public static void main(String[] args) {
 Connection conn = null;
 Statement stmt = null;
 try{
    //STEP 2: Register JDBC driver
    Class.forName(JDBC_DRIVER);

    //STEP 3: Open a connection
    System.out.println("Connecting to database...");
    conn = DriverManager.getConnection(DB_URL, USER, PASS);

    //STEP 4: Execute a query
    System.out.println("Creating statement...");
    stmt = conn.createStatement();
    String sql;
    sql = "SELECT * FROM *";
    ResultSet rs = stmt.executeQuery(sql);

    //STEP 5: Extract data from result set
    while(rs.next()){
       //Retrieve by column name

       String data = rs.getString("last");
       //Display values
       System.out.println("Data Retreived " + data);
    }
    //STEP 6: Clean-up environment
    rs.close();
    stmt.close();
    conn.close();
 }catch(SQLException se){
    //Handle errors for JDBC
     System.out.println("\nJDBC ERROR ! \n");
    se.printStackTrace();
 }catch(Exception e){
    //Handle errors for Class.forName
     System.out.println("\nClass.forName ERROR ! \n");
    e.printStackTrace();
 }finally{
    //finally block used to close resources
    try{
       if(stmt!=null)
          stmt.close();
    }catch(SQLException se2){
        System.out.println("\nSQL ERROR ! NOTHING TO DO \n");
    }// nothing we can do
    try{
       if(conn!=null)
          conn.close();
    }catch(SQLException se){
        System.out.println("\nJDBC ERROR ! MAYBE SOMETHING TO DO \n");
       se.printStackTrace();
    }//end finally try
 }//end try
 System.out.println("\nGoodbye!");
}//end main
}//end FirstExample

Что касается моего Server.xml, то здесь обновленный код:

<server description="Liberty beta">

    <featureManager>
        <feature>webProfile-8.0</feature>
        <feature>adminCenter-1.0</feature>
        <feature>restConnector-2.0</feature>
        <feature>transportSecurity-1.0</feature>
        <feature>logstashCollector-1.1</feature>
        <feature>validator-1.0</feature>

        <feature>mpConfig-1.3</feature>
        <feature>mpFaultTolerance-1.1</feature>
        <feature>mpHealth-1.0</feature>
        <feature>mpJwt-1.0</feature>
        <feature>mpMetrics-1.1</feature>
        <feature>mpOpenAPI-1.0</feature>
        <feature>mpOpenTracing-1.0</feature>
        <feature>mpRestClient-1.0</feature>

        <feature>localConnector-1.0</feature>
        <feature>jdbc-4.2</feature>
    </featureManager>

    <httpEndpoint   id="defaultHttpEndpoint"
                    host="*"
                    httpPort="9080"
                    httpsPort="9443" />

    <applicationManager autoExpand="true"/>

    <keyStore   id="defaultKeyStore"
                password="Liberty" />

    <basicRegistry id="userReg">
        <user   password="admin"
                name="admin"
                id="admin"></user>
    </basicRegistry>

    <administrator-role>
        <user>admin</user>
    </administrator-role>

    <remoteFileAccess>
        <writeDir>${server.config.dir}</writeDir>
    </remoteFileAccess>

    <dataSource id="DefaultDataSource" jndiName="jdbc/mySQL">
        <jdbcDriver libraryRef="MySQLLib" />
        <properties.microsoft.sqlserver databaseName="SAMPLEDB" serverName="localhost" portNumber="3306" user="admin" password="admin"/>
        <connectionManager></connectionManager>
    </dataSource>
    <library id="MySQLLib">
        <file name="C:/PUBLIC/tools/mysql-connector-java-8.0.12/mysql-connector-java-8.0.12/mysql-connector-java-8.0.12.jar" />
    </library>    

</server>

Проблема, с которой я столкнулся сейчас, заключается в том, что я не могу связаться с моим сервером.

здесьэто ошибка консоли:

Connecting to database...

JDBC ERROR ! 


Goodbye!
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:832)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at connection.FirstExample.main(FirstExample.java:23)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
    at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91)
    at com.mysql.cj.NativeSession.connect(NativeSession.java:152)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:952)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:822)
    ... 6 more
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:173)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
    ... 9 more

1 Ответ

0 голосов
/ 01 октября 2018

Будучи новичком, я пытался слепо следовать учебникам, найденным в Интернете, и не особо задумывался о том, что я на самом деле делал.

Я не понимал, что «Свобода» не похожа на настройку виртуальной машины снужные вам сервисы, более того, установка источника данных в Liberty НЕ БУДЕТ настраивать базу данных .из-за недостатка информации, руководства и строгости, я думал, что на сервере Liberty на самом деле работал сервер MySQL, когда я создавал свой источник данных.фактически (поправьте меня, если я ошибаюсь) эта часть кода,

<dataSource id="DefaultDataSource" jndiName="jdbc/mySQL">
    <jdbcDriver libraryRef="MySQLLib" />
    <properties.microsoft.sqlserver databaseName="SAMPLEDB"
                                    serverName="localhost"
                                    portNumber="3306"
                                    user="admin"
                                    password="admin"/>
    <connectionManager></connectionManager>
</dataSource>

<library id="MySQLLib">
    <file name="C:/PUBLIC/tools/mysql-connector-java-8.0.12/mysql-connector-java-8.0.12/mysql-connector-java-8.0.12.jar" />
</library>

предназначена для настройки службы на сервере с соответствующим драйвером для подключения к вашей удаленной базе данных.в этом сценарии я настроил источник данных с драйвером mySQL.

Когда я запускал локальный сервер MySQL, я мог общаться и отправлять запросы через мое Java-приложение.

спасибо за людей, которые нашли время, чтобы прочитать этот пост и пытались помочь мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...