gpt4 book ai didi

java - 自动连线注释在自定义推土机转换器内不起作用

转载 作者:行者123 更新时间:2023-12-02 02:28:25 24 4
gpt4 key购买 nike

我正在使用下一个推土机自定义转换器

public class MyCustomDozerConverter extends DozerConverter<MyObject, String> {

@Autowired
private AppConfig appConfig;

public MyCustomDozerConverter() {
super(MyObject.class, String.class);
}

@Override
public String convertTo(MyObject source, String destination) {
String myProperty = appConfig.getWhatever();
// business logic
return destination;
}

@Override
public MyObject convertFrom(String source, MyObject destination) {
// business logic
return null;
}
}

我的问题是当它通过转换器内的convertTo方法时,我总是得到带有空值的appConfig实例,这当然会导致空指针异常

注意:我的 Spring Boot 类上面有这些注释:

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan({"com.xxx"})
@EntityScan("com.xxx")
@EnableJpaRepositories("com.xxx")

最佳答案

我通过下一个技巧解决了这个问题:

1- Using static with appConfig property.

2- instantiate it by spring so when dozer use default empty constructor it will find appConfig have a value already (which assigned before to it by spring)

这是我为此使用的代码:

@Component //import org.springframework.stereotype.Component;
public class MyCustomDozerConverter extends DozerConverter<MyObject, String> {

private static AppConfig appConfig;

// dozer needs this constructor to create an instance of converter (so it's a mandatory constructor)
public MyCustomDozerConverter() {
super(MyObject.class, String.class);
}

@Autowired // Spring will pass appConfig to constructor
public MyCustomDozerConverter(AppConfig appConfig) {
this();
this.appConfig = appConfig;
}

@Override
public String convertTo(MyObject source, String destination) {
String myProperty = appConfig.getWhatever();
// business logic
return destination;
}

@Override
public MyObject convertFrom(String source, MyObject destination) {
// business logic
return null;
}
}

更新:另一种解决方案

另一个技巧是使用 Spring ApplicationContextAware 从 getBean 方法获取单例对象:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextHolder implements ApplicationContextAware {
private static ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}

public static ApplicationContext getContext() {
return context;
}
}

然后在 AppConfig 类中创建一个静态方法并返回与所需类型匹配的单个 bean 的实例:

import org.springframework.context.annotation.Configuration;
import com.tripbru.ms.experiences.ApplicationContextHolder;

@Configuration
public class AppConfig {

// Static method used to return an instatnce
public static AppConfig getInstance() {
return ApplicationContextHolder.getContext().getBean(AppConfig.class);
}

// Properties
}

然后通过 AppConfig.getInstance(); 在推土机转换器内直接调用它

public class MyCustomDozerConverter extends DozerConverter<MyObject, String> {

private static AppConfig appConfig;

public MyCustomDozerConverter() {
super(MyObject.class, String.class);
appConfig = AppConfig.getInstance(); // Here are we intializing it by calling the static method we created.
}

@Override
public String convertTo(MyObject source, String destination) {
String myProperty = appConfig.getWhatever();
// business logic
return destination;
}

@Override
public MyObject convertFrom(String source, MyObject destination) {
// business logic
return null;
}
}

关于java - 自动连线注释在自定义推土机转换器内不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47488944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com