自定义json序列化程序(Bean注入)

时间:2018-06-22 08:47:49

标签: java

我有一个接口,其中包含两个实现。

   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异常。

没有注入豆吗??

1 个答案:

答案 0 :(得分:0)

根据您的代码,我假设您正在使用Spring。我可以想到字段edservice可能为null null的两个原因:

  1. 在其应用程序上下文中找不到属性vault.encryptdecrypt.provider。
  2. 在其应用程序上下文中找不到
  3. 具有给定名称的Bean。

您可以添加

@Value("vault.encryptdecrypt.provider") private String provider;

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

以上内容当然是假设MaskSerializer和LogService Bean在不同的应用程序上下文中。否则,我唯一能想到的就是您正在执行以下操作:

MaskSerializer maskSerializer = new MaskSerializer();

代替此(或与@Resource或@Inject等效):

@Autowired MaskSerializer maskSerializer;

代码中的某个地方。