我正在尝试示例化一个类,该类使用start()
方法实现了一个名为RestApp
的接口。
public interface RestApp {
void start() throws RestAppException;
}
字符串
实现该接口的类如下:
import settings.Settings.Server;
@SpringBootApplication
class SpringRestApp implements RestApp {
private final Server serverSettings;
SpringRestApp(Server serverSettings) {
this.serverSettings = serverSettings;
}
@Override
public void start() throws RestAppException {
var app = new SpringApplication(SpringRestApp.class);
app.setDefaultProperties(Collections.singletonMap("server.port", this.serverSettings.port()));
app.run();
}
}
型
这是我第一次使用spring Boot ,我试着启动应用程序,它给予了我下一个错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in internal.rest.SpringRestApp required a bean of type 'settings.Settings$Server' that could not be found.
Action:
Consider defining a bean of type 'settings.Settings$Server' in your configuration.
Process finished with exit code 1
型
我真正想做的是将spring Boot 从所有项目中分离出来,spring的唯一责任就是侦听HTTP请求并使用控制器处理该请求。
事实上,我没有使用spring Boot 的autoconfiguration,我使用的是我自己的配置类,它使用了“Apache Configurations”库,我不希望在我的类Settings中有任何注解。
我试过使用chat gpt,但它只告诉我这些废话:
public class Main {
public static void main(String[] args) {
// Create instances of the needed objects
Server serverSettings = new Server(); // Suppose that this is your settings class
RestApp restApp = new SpringRestApp(serverSettings);
// Do the dependency injection manually <-- WTF?!?!
// ...
// Start the application
try {
restApp.start();
} catch (RestAppException e) {
e.printStackTrace();
}
}
}
型
我在谷歌和YouTube上都没有找到任何信息。对不起,我的英语,但我很感激你的帮助。
下一个类是示例化数据库和服务器http的设置记录的类,名为:数据库和服务器。我试着把组件注解放在服务器记录中,但它不起作用。
public class Settings {
public final Database database;
public final Server server;
public Settings() throws ConfigurationException {
var config = new Configurations().properties(new File(".properties"));
config.setThrowExceptionOnMissing(true);
this.database = new Database(
config.getString("DB_USER"),
config.getString("DB_PASSWORD", ""),
config.getString("DB_DRIVER"),
config.getString("DB_HOST"),
config.getInt("DB_PORT"),
config.getString("DB_NAME")
);
this.server = new Server(
config.getInt("SERVER_PORT"),
config.getString("SERVER_FRAMEWORK")
);
}
public record Database(
String user,
String password,
String driver,
String host,
int port,
String name
) {}
@Component
public record Server(
int port,
String framework
){}
}
型
3条答案
按热度按时间2nc8po8w1#
像这样添加一个新方法,以便Spring创建一个具有指定名称的bean(名称不是必需的,您也可以使用
@Bean
)字符串
或者将@Component添加到类中,但name是可选的
型
5lhxktic2#
考虑在您的配置中定义一个类型为'settings.Settings$Server'的bean
在Server类的顶部添加@Component应该可以解决问题
既然你不想让springboot应用任何DI(你想自己练习DI),你应该从你的类中删除所有的@Component注解。同时删除RestApp类上的@SpringBootApplication注解。这些注解将底层类标记为托管组件,Spring将代表您负责创建和注入依赖项
xwmevbvl3#
如果不使用Bean,就不能使用Sping Boot 或Spring Framework。所以我在寻找另一个框架/库,它可以完成这项工作,而不需要依赖注入和Spring Bean的任何“魔力”。我发现了一个叫做Jakarta RESTful Web Services的东西,它并没有强迫你用依赖注入和Bean做一些神奇的事情。所以我只添加了Jersey框架,这是Jakarta RESTful Web Services的实现,并删除了Sping Boot 。它有一个非常直观的API,没有任何魔法,而且很直接