我正在从事一个Spring Boot项目,在尝试自动连接服务时遇到了一些问题。这是我当前的代码:
@Component
public class StealFromPocket implements Command {
private Integer gameId;
private Player playerFrom;
@Autowired
GameService gameService;
public StealFromPocket(Integer gameId, Player playerFrom) {
this.gameId = gameId;
this.playerFrom = playerFrom;
}
@Override
public void execute() {
gameService.findPlayersByGameId(gameId).forEach(player -> {
new StealCoinCommand(playerFrom, player).execute();
});
}
}
构造函数参数gameId
和playerFrom
在运行时是已知的,因此我无法硬编码它们或将它们存储在配置文件中。
这是通过反射从服务
实例化StealFromPocket
的地方(完成ClassName
将根据用户交互而更改。在这个例子中,它将是org.springframework.。StealFromPocket
:
Class<?> clazz = Class.forName(completeClassName);
Object card = clazz.getDeclaredConstructor(Integer.class, Player.class).newInstance(gameId, playerFrom);
Method method = clazz.getDeclaredMethod("execute");
method.invoke(card);
当试图构建项目时,我得到以下错误:
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of constructor in org.springframework.ntfh.cardlogic.abilitycard.rogue.RobarBolsillos required a bean of type 'java.lang.Integer' that could not be found.
Action:
Consider defining a bean of type 'java.lang.Integer' in your configuration.
我相信问题在于我没有将GameService
作为构造函数参数传递,但是由于我的项目的性质,这些服务不能作为参数传递,因为它们将根据通过反射实例化的类而有所不同。
我通过更改类的实现来解决这个问题,从而execute
方法接收相应的参数,并且自动连接字段是StealFromPocket
类的唯一属性。现在看起来是这样的:
@Component
public class StealFromPocket {
@Autowired
private GameService gameService;
public void execute(Player playerFrom) {
Integer gameId = playerFrom.getGame().getId();
gameService.findPlayersByGameId(gameId).forEach(player -> {
new StealCoinCommand(playerFrom, player).execute();
});
}
}
在游戏服务中。java
我执行以下操作:
// Get the class from its name
Class<?> clazz = Class.forName(completeClassName);
// Instantiate an object of the class
Object cardCommand = clazz.getDeclaredConstructor().newInstance();
// Autowire the new object's dependencies (services used inside)
AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(cardCommand);
factory.initializeBean(cardCommand, className);
// Get a reference to the method "execute", that receives 2 parameters
Method method = clazz.getDeclaredMethod("execute", Player.class);
// Execute the method with the parameters
method.invoke(cardCommand, playerFrom);
问题内容: 我是Spring的新手。 这是bean注册的代码: 这是我的bean类: 这是我执行操作的主要方法: 现在,我想用参数调用此构造函数,并且这些参数是在我的主要方法中动态生成的。这就是我想动态传递- 而不是像文件中声明的那样静态传递的意思。 问题答案: 请看一下构造函数注入。 此外,请查看IntializingBean和BeanPostProcessor,以了解Springbean的其他
我不熟悉Spring。 这是bean注册的代码: 这是我的豆子课: 这是我执行动作的主要方法: 现在我想用参数调用这个构造函数,这些参数是在我的主要方法中动态生成的。这就是我想动态传递的意思——而不是静态传递,就像我的文件中声明的那样。
我试图将构造函数参数动态传递给Springboot框架中的一个bean。我已经使用context.getBean(class,arg...)在Spring中动态传递构造函数参数,但它没有成功获取值并显示默认值。我的代码有什么问题? 项目结构: 应用程序上下文.xml 应用 活动 输出:
我有三节课 1.菜单活动 2.LocationUpdateService 3.多重标记器 1.菜单活动 2、LocationUpdateService:(这是服务类) 3、多重标记(活动) 我的问题是:当我打开我的菜单活动我的Toast消息打印发送数据到广播接收器,然后点击按钮我调用MultipleMarker。我无法从服务中获取值。。。但当我按下后退按钮时,我重定向到MenuActivity,此
问题内容: 我的工厂如下 这是Foo的定义: 好。我不确定如何使用Guice将此参数传递给Foo构造函数? 有任何想法吗? 问题答案: 所有“ Guice构造函数参数”答案在某种程度上似乎都不完整。这是一个完整的解决方案,包括用法: //在实现类上注释构造函数和辅助参数 //使用仅接受辅助参数的create()方法创建工厂接口。 // FooFactory接口没有显式的实现类(Guice Magi
我试图通过动态输入要从中提取数据的工作表的名称,以这种方式重用现有的数据提供程序,将Excel文件中的数据加载到我的测试框架中。 示例:我正在从Login凭据表加载数据,该表代表成功登录测试的数据。第二个测试是失败的登录测试,它从InvalidLogin凭据表加载数据。第三个测试从第三个表UserInformation等中提取数据。我所遵循的udemy课程并没有真正涵盖这个主题,我觉得整个事情的实