Просмотр исходного кода

fix 修复 jackson createContextual 用法不标准导致可能出现的并发问题(https://gitee.com/dromara/RuoYi-Cloud-Plus/issues/IFAM5Z)

疯狂的狮子Li 4 месяцев назад
Родитель
Сommit
f773818642

+ 10 - 7
ruoyi-common/ruoyi-common-sensitive/src/main/java/org/dromara/common/sensitive/handler/SensitiveHandler.java

@@ -25,9 +25,15 @@ import java.util.Objects;
 @Slf4j
 @Slf4j
 public class SensitiveHandler extends JsonSerializer<String> implements ContextualSerializer {
 public class SensitiveHandler extends JsonSerializer<String> implements ContextualSerializer {
 
 
-    private SensitiveStrategy strategy;
-    private String[] roleKey;
-    private String[] perms;
+    private final SensitiveStrategy strategy;
+    private final String[] roleKey;
+    private final String[] perms;
+
+    public SensitiveHandler(SensitiveStrategy strategy, String[] strings, String[] perms) {
+        this.strategy = strategy;
+        this.roleKey = strings;
+        this.perms = perms;
+    }
 
 
     @Override
     @Override
     public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
     public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
@@ -48,10 +54,7 @@ public class SensitiveHandler extends JsonSerializer<String> implements Contextu
     public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
     public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
         Sensitive annotation = property.getAnnotation(Sensitive.class);
         Sensitive annotation = property.getAnnotation(Sensitive.class);
         if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
         if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
-            this.strategy = annotation.strategy();
-            this.roleKey = annotation.roleKey();
-            this.perms = annotation.perms();
-            return this;
+            return new SensitiveHandler(annotation.strategy(), annotation.roleKey(), annotation.perms());
         }
         }
         return prov.findValueSerializer(property.getType(), property);
         return prov.findValueSerializer(property.getType(), property);
     }
     }

+ 6 - 3
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/handler/TranslationHandler.java

@@ -31,7 +31,11 @@ public class TranslationHandler extends JsonSerializer<Object> implements Contex
      */
      */
     public static final Map<String, TranslationInterface<?>> TRANSLATION_MAPPER = new ConcurrentHashMap<>();
     public static final Map<String, TranslationInterface<?>> TRANSLATION_MAPPER = new ConcurrentHashMap<>();
 
 
-    private Translation translation;
+    private final Translation translation;
+
+    public TranslationHandler(Translation translation) {
+        this.translation = translation;
+    }
 
 
     @Override
     @Override
     public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
     public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
@@ -63,8 +67,7 @@ public class TranslationHandler extends JsonSerializer<Object> implements Contex
     public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
     public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
         Translation translation = property.getAnnotation(Translation.class);
         Translation translation = property.getAnnotation(Translation.class);
         if (Objects.nonNull(translation)) {
         if (Objects.nonNull(translation)) {
-            this.translation = translation;
-            return this;
+            return new TranslationHandler(translation);
         }
         }
         return prov.findValueSerializer(property.getType(), property);
         return prov.findValueSerializer(property.getType(), property);
     }
     }