Java 序列化@Validated类
假设我有一个properties类,它在一个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
类中使用,这个类需要通过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();
}