java - 构造函数注入(inject)阻止自定义资源处理

标签 java spring-data-rest spring-hateoas

在我的(重要的)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。如果没有 @LazyMessageSendingOperations 将首先初始化。

另外:从 Spring 4.3 开始,@Autowiredno longer required对于单参数构造函数。

+1 用于使用构造函数注入(inject)和 final 字段。

关于java - 构造函数注入(inject)阻止自定义资源处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740095/

相关文章:

java -/storage/emulated/0/Notes/(没有这样的文件或目录)?

java - 基于 CMS 的应用程序的一般架构

loading - Spring Data Rest 添加摘录投影关闭延迟获取

hateoas - 如何使用 Spring-hateoas 构建具有 "templated:true"的 HAL 链接?

java - 使用 Spring Data REST 处理子实体集合中的资源链接

spring-mvc - 添加指向 Spring Data REST Repository 资源的链接

java - 我的星号框程序无法正常工作

java if long 不起作用

spring-data-rest - Spring Data Rest (SDR) 错误 : PersistentEntity must not be null

java - 用于投影异常的 Spring Data Rest ResourceProcessor