在我的(重要的)Spring Boot 1.5.4 应用程序中,使用 Spring Data REST 和 HATEOAS 利用 Spring websockets,我有一些自定义资源处理器、一些自定义 Controller 和一些自定义存储库。遗憾的是,当我在一个特定的 Spring @Service
类中使用构造函数注入(inject)来实现 MessageSendingOperations
依赖项时,我的自定义资源处理器不再被调用。恢复构造函数注入(inject)会恢复我的自定义资源处理器的执行,即从以下位置恢复:
private final MessageSendingOperations<String> messageTemplate;
@Autowired
public ChannelHandler(MessageSendingOperations<String> messageTemplate) {
this.messageTemplate = messageTemplate;
}
至:
@Autowired
private MessageSendingOperations<String> messageTemplate;
“重新启用”我的自定义资源处理器,这会导致 null
messageTemplate
。所以,某个地方有问题......但在哪里???有什么想法如何追踪这个问题吗?
最佳答案
您是否尝试过使 messageTemplate
成为延迟注入(inject)的代理?例如:
public ChannelHandler(@Lazy MessageSendingOperations<String> messageTemplate) {
this.messageTemplate = requireNonNull(messageTemplate, "messageTemplate");
}
来自Javadoc :
In addition to its role for component initialization, this annotation may also be placed on injection points marked with Autowired or Inject: In that context, it leads to the creation of a lazy-resolution proxy for all affected dependencies, as an alternative to using ObjectFactory or Provider.
这通常会影响 Bean 的初始化顺序,在本例中允许在 MessageSendingOperations
之前初始化 ChannelHandler
。如果没有 @Lazy
,MessageSendingOperations
将首先初始化。
另外:从 Spring 4.3 开始,@Autowired
为 no longer required对于单参数构造函数。
+1 用于使用构造函数注入(inject)和 final
字段。
关于java - 构造函数注入(inject)阻止自定义资源处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740095/