Java 序列化@Validated类

Java 序列化@Validated类,java,spring,bean-validation,Java,Spring,Bean Validation,假设我有一个properties类,它在一个类中使用,这个类需要通过Spring缓存序列化,使用Redis作为实现。我还使用Spring的@Validated()注释来验证这个类 @ConfigurationProperties(prefix = "myprops") @Validated public class MyProps implements Serializable { } @EnableConfigurationProperties(MyProps.class) @Named

假设我有一个properties类,它在一个
类中使用,这个类需要通过Spring缓存序列化,使用Redis作为实现。我还使用Spring的
@Validated
()注释来验证这个类

@ConfigurationProperties(prefix = "myprops")
@Validated
public class MyProps implements Serializable {

}

@EnableConfigurationProperties(MyProps.class)
@Named
public class ClassThatNeedsToBeSerialized implements Serializable {
   @Inject
   private MyProps myProps;
}
正在尝试缓存此类的实例:

@Inject
private ClassThatNeedsToBeSerialized classThatNeedsToBeSerialized;

@Cacheable("my-cache")
public ClassThatNeedsToBeSerialized fetch() {
   return classThatNeedsToBeSerialized;
}
将引发具有以下stacktrace的异常:

org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException: org.springframework.validation.beanvalidation.MethodValidationInterceptor
        at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:68)
        at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35)
        at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:94)
        ... 31 common frames omitted
    Caused by: java.io.NotSerializableException: org.springframework.validation.beanvalidation.MethodValidationInterceptor
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
        at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:46)
        at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:63)
        ... 33 common frames omitted 

有没有办法序列化用
@Validated
注释的类?如果没有,是否有类似的替代方案可以使用?

我已通过注册
configurationPropertiesValidator
bean解决了此问题,如下所述:

MyClass
创建自定义验证器:

public class ClassThatNeedsToBeSerializedValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return ClassThatNeedsToBeSerialized.class.equals(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        //Validate
    }
}
需要序列化的类
现在可以实现
可序列化
,并且可以毫无问题地序列化。这样做的缺点是:

  • 据我所知,无法注册多个ConfigurationPropertiesValidator
  • 无注释
    @Bean
    public Validator configurationPropertiesValidator() {
        return new ClassThatNeedsToBeSerializedValidator();
    }