当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot中自动连接服务并将动态参数传递给构造函数

申屠弘图
2023-03-14

我正在从事一个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();
        });

    }
}

构造函数参数gameIdplayerFrom在运行时是已知的,因此我无法硬编码它们或将它们存储在配置文件中。

这是通过反射从服务实例化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作为构造函数参数传递,但是由于我的项目的性质,这些服务不能作为参数传递,因为它们将根据通过反射实例化的类而有所不同。

共有1个答案

锺离辰沛
2023-03-14

我通过更改类的实现来解决这个问题,从而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课程并没有真正涵盖这个主题,我觉得整个事情的实