gpt4 book ai didi

java - 为什么我收到 java.sql 可能无法访问客户端由于缺少 'requires transitive'

转载 作者:行者123 更新时间:2023-12-03 07:51:30 26 4
gpt4 key购买 nike

我在我的项目中使用了 javafx 和 sdk20。我在使用数据库时遇到一些警告。(我的IDE是eclipse)

警告是:

Description Resource    Path    Location    Type
The type Connection from module java.sql may not be accessible to clients due to missing 'requires transitive' dbConnect.java /myProject/src/mypackage line 25 Java Problem

db.java:

package mypackage;;
import java.io.IOException;
import java.sql.*; // Use classes in java.sql package
import java.util.Properties;

public class dbConnect {
// init database constants
static final String databaseDriver = "oracle.jdbc.driver.OracleDriver";
static final String databaseURL = "jdbc:oracle:thin:@localhost:1521:xe";
static final String username = "system";
static final String pass = "oracle";
private Connection connection;
private Properties properties;
private Statement statement;

/**
* Connect to the database
*
* @return Connection
*/
public Connection connect()
{
if (connection == null)
{
try {
Class.forName(databaseDriver);
connection = (Connection) DriverManager.getConnection
(databaseURL, getProperties());
}
catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
return connection;
}
.
.
.

modjule-info.java

module myProject{
requires transitive javafx.graphics;
requires javafx.controls;
requires javafx.fxml;
requires javafx.base;
requires javafx.web;
requires java.sql;

opens mypackage to javafx.fxml;
exports mypackage;
}

我对 ResultSet 和PreparedStatement 也有这些警告。我没有输入那段代码。

最佳答案

出现警告是因为您在公共(public) DbConnect 类中定义了一个 public 方法 connect(),该方法的返回类型为连接。该方法是 public 表明可以从任何地方调用该方法,包括需要您的模块 myProject 的其他模块中的任何类。但是,这些类将无法这样做,因为它们将无法访问位于 java.sql 模块中的 Connection 类。

您可能不需要该方法具有如此广泛的可访问性。事实上,您的数据被保存到关系数据库中,在一定程度上是一个实现细节,确实不应该暴露给应用程序中的其他层。

您可能有某种数据访问类,它可以访问和保留域对象,并使它们可供应用程序中的其他层使用(例如,具有 UI 的表示层等):

package myPackage;

public class DataAccessor {

private final Connection connection ;

public DataAccessor() {
DbConnect dbConnect = new DbConnect();
this.connection = dbConnect.connect();
}

public List<Foo> getAllFoos() throws Exception {
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery("SELECT * FROM foo");
List<Foo> foos = new ArrayList<>();
while (result.next()) {
Foo foo = new Foo();
foo.setBar(result.getString("bar"))
// ...
foos.add(foo);
}
result.close();
statement.close();
return foos;
}

// etc
}

在几乎所有情况下,任何数据访问类都与 DbConnect 类位于同一个包中,并且在外部的任何地方都不需要 DbConnect.connect() 方法那个包裹。这意味着 connect() 方法不需要是 public,并且仅将可见性限制在需要的范围内是一般的良好做法。

在这种常见情况下,您可以使该方法具有默认的“包私有(private)”可见性,这将删除警告:

public class DbConnect {

private Connection connection;

Connection connect() {
if (connection == null)
{
try {
Class.forName(databaseDriver);
connection = (Connection) DriverManager.getConnection
(databaseURL, getProperties());
}
catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
return connection;
}

}

如果(不太可能)您确实想让 connect() 方法公开可用,您需要使 java.sql 模块可供以下客户端使用你的模块。您可以通过传递性要求该模块来做到这一点:

module myProject{
requires transitive javafx.graphics;
requires javafx.controls;
requires javafx.fxml;
requires javafx.base;
requires javafx.web;
requires transitive java.sql;

opens mypackage to javafx.fxml;
exports mypackage;
}

但是,您不太可能需要这样做,或者需要构建您的应用程序来实现这一点。

关于java - 为什么我收到 java.sql 可能无法访问客户端由于缺少 'requires transitive',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76984082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com