我有一个接口,其中包含两个实现。
public interface IEncryptDecryptService {
String encrypt(String text);
String decrypt(String text);
}
一个班是
@Service("SunJks")
public class GeneralEncryptDecryptServiceImpl implements
IEncryptDecryptService {
public String encrypt{
}
public String decrypt{
}
}
另一堂课是
@Service("SafenetHsm")
public class SafenetHsmEncryptDecryptServiceImpl implements
IEncryptDecryptService {
public String encrypt{
}
public String decrypt{
}
}
我想在另一个类中注入两个类之一。
@Component
public class LogService implements ILogService {
@Resource(name = "${vault.encryptdecrypt.provider}")
private IEncryptDecryptService edservice;
public display{
edservice.encrypt("***");
}
这是我需要两个注入两个bean之一的类。
在application.properties中,我已经配置了
#Provider Configurer
vault.encryptdecrypt.provider=SunJks
然后注入“ GeneralEncryptDecryptServiceImpl”。
#Provider Configurer
vault.encryptdecrypt.provider=SafenetHsm
然后将SafenetHsmEncryptDecryptServiceImpl注入“ LogService”类。
它工作正常。 并且如果我在Custom JsonSerializer类中实现相同的功能,则无法正常工作,则不会注入bean。
@Component
public class MaskSerializer extends JsonSerializer<Xclass> {
@Resource(name = "${vault.encryptdecrypt.provider}")
private IEncryptDecryptService edservice;
@Override
public void serialize(Xclass value, JsonGenerator gen,
SerializerProvider provider) throws IOException {
String str = value.getPersistenceValue();
String strr = edservice.encrypt(str);
gen.writeStartObject();
gen.writeFieldName(strr);
gen.writeEndObject();
}
我在上述类中的edservice.encrypt(str)上得到了nullpointer异常。
没有注入豆吗??
答案 0 :(得分:0)
根据您的代码,我假设您正在使用Spring。我可以想到字段edservice可能为null null的两个原因:
您可以添加
@Value("vault.encryptdecrypt.provider") private String provider;
对MaskSerializer进行分类,以确定是否找到了该属性-如果找到了该属性,则您将知道应用程序上下文中缺少Bean而不是该属性。然后,您只需要在特定上下文中定义该特定bean。否则,您将需要定义适当的PropertySource来读取属性文件。
以上内容当然是假设MaskSerializer和LogService Bean在不同的应用程序上下文中。否则,我唯一能想到的就是您正在执行以下操作:
MaskSerializer maskSerializer = new MaskSerializer();
代替此(或与@Resource或@Inject等效):
@Autowired MaskSerializer maskSerializer;
代码中的某个地方。