Java Lambda集成Dagger2遇依赖注入问题:无公共无参构造方法报错
Java Lambda集成Dagger2注入依赖的解决方案
问题本质
Lambda运行时会通过反射实例化处理器类,强制要求类有公共无参构造;但Dagger2依赖带参构造注入对象,直接添加无参构造会导致Lambda用无参方式实例化,依赖无法注入而变为null。
方案一:静态初始化+手动注入
给处理器类添加公共无参构造,通过静态块初始化Dagger组件,在构造中手动触发注入:
public class GameSessionLambda implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { private static GameSessionComponent daggerComponent; @Inject InjectedConstants injectedConstants; static { // 静态块初始化Dagger组件,仅执行一次 daggerComponent = DaggerGameSessionComponent.create(); } // 满足Lambda要求的公共无参构造 public GameSessionLambda() { // 手动触发依赖注入 daggerComponent.inject(this); } @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) { // 正常使用注入的对象 System.out.println(injectedConstants.getApiKey()); // 业务逻辑实现... return new APIGatewayProxyResponseEvent().withStatusCode(200); } }
方案二:代理类(工厂模式)
创建一个代理处理器作为Lambda入口,代理类满足无参构造要求,内部初始化Dagger组件并注入真正的处理器:
1. 代理处理器类(Lambda入口)
public class GameSessionLambdaProxy implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { private final GameSessionLambda actualHandler; public GameSessionLambdaProxy() { // 初始化Dagger组件 GameSessionComponent component = DaggerGameSessionComponent.create(); // 获取已注入依赖的真正处理器实例 actualHandler = component.provideGameSessionLambda(); } @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) { // 转发请求给真正的处理器 return actualHandler.handleRequest(input, context); } }
2. 真正的处理器类(保持带参构造)
public class GameSessionLambda implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> { private final InjectedConstants injectedConstants; // Dagger2通过该构造注入依赖 @Inject public GameSessionLambda(InjectedConstants injectedConstants) { this.injectedConstants = injectedConstants; } @Override public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) { // 使用注入的对象 System.out.println(injectedConstants.getApiKey()); // 业务逻辑实现... return new APIGatewayProxyResponseEvent().withStatusCode(200); } }
3. 修改Dagger Component接口
添加提供处理器实例的方法:
@Component(modules = {GameSessionModule.class}) public interface GameSessionComponent { // 提供已注入依赖的GameSessionLambda实例 GameSessionLambda provideGameSessionLambda(); }
注意事项
- 确保Dagger生成的组件类(如
DaggerGameSessionComponent)已编译生成,可通过执行构建命令(Gradle:./gradlew clean build;Maven:mvn clean compile)触发生成。 - 两种方案都能解决Lambda实例化规则与Dagger注入规则的冲突,可根据项目复杂度选择。
内容的提问来源于stack exchange,提问作者Raze
相关产品推荐
相关产品推荐

