Java 自定义json序列化程序(Bean注入)
我有一个包含两个实现的接口Java 自定义json序列化程序(Bean注入),java,Java,我有一个包含两个实现的接口 public interface IEncryptDecryptService { String encrypt(String text); String decrypt(String text); } 一类是 @Service("SunJks") public class GeneralEncryptDecryptServiceImpl implements IEncryptDecryptService { publ
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
@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();
}
然后将SafenetHsmEncryptDecryptServiceImpl注入到“LogService”类中
它很好用。
若我在自定义JsonSerializer类中实现了相同的东西,那个么它就不工作了,bean就不会被注入
#Provider Configurer
vault.encryptdecrypt.provider=SafenetHsm
@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();
}
@组件
公共类MaskSerializer扩展了JsonSerializer{
@资源(名称=“${vault.encryptdecrypt.provider}”)
私有EnciencryPtDecryptedService;
@凌驾
public void序列化(Xclass值,JsonGenerator gen,
SerializerProvider提供程序)引发IOException{
字符串str=value.getPersistenceValue();
字符串strr=edservice.encrypt(str);
gen.writeStartObject();
gen.writeFieldName(strr);
writeEndObject将军();
}
我在上述类中的edservice.encrypt(str)处收到nullpointer异常
Bean没有从您的代码中注入???我假设您使用的是Spring。我可以想到两个原因,为什么field edservice可能为null:
@Value("vault.encryptdecrypt.provider") private String provider;
对MaskSerializer进行分类以确定是否找到了属性-如果找到了,则您将知道应用程序上下文中缺少的是bean而不是属性。然后您只需在该特定上下文中定义该特定bean。否则,您将需要定义适当的PropertySource来读取您的属性文件
当然,以上假设MaskSerializer和LogService bean位于不同的应用程序上下文中。否则,我唯一能想到的是您正在这样做:
MaskSerializer maskSerializer = new MaskSerializer();
与此相反(或与@Resource或@Inject等效):
在代码中的某个地方。您能提供关于依赖项注入的框架或库以及配置的程度的信息吗