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:

  • 在其应用程序上下文中找不到属性vault.encryptdecrypt.provider
  • 在其应用程序上下文中找不到具有给定名称的Bean
  • 你可以加上

    @Value("vault.encryptdecrypt.provider") private String provider;
    
    对MaskSerializer进行分类以确定是否找到了属性-如果找到了,则您将知道应用程序上下文中缺少的是bean而不是属性。然后您只需在该特定上下文中定义该特定bean。否则,您将需要定义适当的PropertySource来读取您的属性文件

    当然,以上假设MaskSerializer和LogService bean位于不同的应用程序上下文中。否则,我唯一能想到的是您正在这样做:

    MaskSerializer maskSerializer = new MaskSerializer();
    
    与此相反(或与@Resource或@Inject等效):


    在代码中的某个地方。

    您能提供关于依赖项注入的框架或库以及配置的程度的信息吗