我有参数化接口和实现该接口的参数化类。然后我将这个类注入到 3 个服务中,并在 @PostConstruct 方法中设置 typeParameterClass。 2 个类返回正确的 typeParameterClass,但其他一个类从另一服务返回 typeParameterClass,而不是在 @PostConstruct 中的此类中设置的类型。
喜欢
ClassOneServiceImpl.getParameter() = ClassOne.class;
ClassTwoServiceImpl.getParameter() = ClassTwo.class;
ClassThreeServiceImpl.getParameter() = ClassOne.class;
我已将日志记录添加到初始化中,但是我发现 setTypeParameterClass(Class clazz) 中设置的 TypeParameterClass 是正确的。
在 jdk-17 Temurin 的本地环境中,程序运行良好。
有什么建议为什么@PostCOnstruct 不能按预期工作吗?或者问题可能发生在其他地方?
public interface PostgresDAO<T> {
void setTypeParameterClass(Class<T> clazz);
Entity findEntityById(Long id);
}
@Repository
@NoArgsConstructor
@Getter
public class PostgresDAOImpl<T> implements PostgresDAO<T> {
private Class<T> typeParameterClass
@PersistenceContext
private EntityManager em;
@Override
public void setTypeParameterClass(Class<T> clazz) {
this.typeParameterClass = clazz;
}
**** some code with EntityManager
}
我有 3 个服务正在使用具有不同参数的 PostgresDAOImpl。
@Service
@RequiredArgsConstructor
public class ClassOneServiceImpl implements ClassOneService {
private final PostgresDAO<ParameterOne> dao;
@PostConstruct
public void enrichDao() {
dao.setTypeParameterClass(ParameterOne.class);
}
public Class getParameter() {
return dao.getTypeParameterClass();
}
***** some code
}
@Service
@RequiredArgsConstructor
public class ClassTwoServiceImpl implements ClassTwoService {
private final PostgresDAO<ParameterTwo> dao;
@PostConstruct
public void enrichDao() {
dao.setTypeParameterClass(ParameterTwo.class);
}
public Class getParameter() {
return dao.getTypeParameterClass();
}
***** some code
}
@Service
@RequiredArgsConstructor
public class ClassThreeServiceImpl implements ClassThreeService {
private final PostgresDAO<ParameterThree> dao;
@PostConstruct
public void enrichDao() {
dao.setTypeParameterClass(ParameterThree.class);
}
public Class getParameter() {
return dao.getTypeParameterClass();
}
***** some other code
}
添加了 javax.annotation 依赖项
<!--need for postconstruct annotation in java 11 https://www.baeldung.com/spring-postconstruct-predestroy-->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
设置
openjdk版本“11.0.4”2019-07-16 LTS
OpenJDK 运行时环境 18.9(内部版本 11.0.4+11-LTS)
OpenJDK 64位服务器VM 18.9(构建11.0.4+11-LTS,混合模式,共享)
我很惊讶它在本地有效,因为它不应该。默认情况下,Spring bean 是单例,在您的代码示例中,您可以在所有
ClassOne
、ClassTwo
和 ClassThree
服务中注入相同的 bean。在 PostConstruct
方法中,您只需重写参数类。
为了解决这个问题,您在
PostgresDAOImpl
带注释的类中创建三个 @Configuration
存储库,并将每个存储库注入相关服务中。如果你这样做,很可能你甚至根本不需要 PostConstruct
方法。