LanguageUtil.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package com.backendsys.utils;
  2. import com.backendsys.config.Security.service.TokenService;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.stream.Collectors;
  8. import java.lang.reflect.Field;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.data.redis.core.StringRedisTemplate;
  12. import org.springframework.stereotype.Component;
  13. @SuppressWarnings({"rawtypes", "unchecked"})
  14. @Component
  15. public class LanguageUtil {
  16. @Autowired
  17. private TokenService tokenService;
  18. @Autowired
  19. private StringRedisTemplate stringRedisTemplate;
  20. @Value("${DEFAULT_LANGUAGE}")
  21. private String DEFAULT_LANGUAGE;
  22. public String getLang() {
  23. // 配置语言参数
  24. String langRedisKey = "lang:" + tokenService.getLoginUUID();
  25. String lang = stringRedisTemplate.opsForValue().get(langRedisKey);
  26. if (lang.isEmpty()) lang = DEFAULT_LANGUAGE;
  27. return lang;
  28. }
  29. /**
  30. * 完整示例:
  31. Map<String, Object> fieldPrimary = Collections.singletonMap("article_id", cmsArticleDTO.getArticle_id());
  32. cmsArticleMapper.insertArticleTranslations(languageUtil.getTranslationsField(fieldPrimary, cmsArticleDTO, CmsArticleTranslationsDTO.class));
  33. *
  34. * 使用说明 :getTranslationsField([fieldPrimary], [class], [transitions.class])
  35. *
  36. * - [fieldPrimary] 获得主键的键与值 { article_id: 1 } (Map类型)
  37. * Map<String, Object> fieldPrimary = Collections.singletonMap("article_id", cmsArticleDTO.getArticle_id());
  38. * - [class] 获得 载体 的实体类对象 (默认对应实体类对象的 translations 字段)
  39. * cmsArticleDTO
  40. * - [translations.class] 获得 翻译表 对应的实体类 (Class)
  41. * CmsArticleTranslationsDTO.class
  42. */
  43. public <T> List<Map<String, Object>> getTranslationsField(Map<String, Object> fieldPrimary, T dto, Class<?> cls) {
  44. List<Map<String, Object>> result = new ArrayList<>();
  45. try {
  46. List<String> fields = getFieldNames(cls);
  47. Field translationsField = dto.getClass().getDeclaredField("translations");
  48. translationsField.setAccessible(true); // 设置可访问私有字段
  49. List<Object> translations = (List<Object>) translationsField.get(dto);
  50. result = translations.stream().map(trans -> {
  51. Map<String, Object> translation = new HashMap<>();
  52. for (int i = 0; i < fields.size(); i++) {
  53. try {
  54. Field field = trans.getClass().getDeclaredField(fields.get(i));
  55. // 默认情况下,Java 中的成员变量和方法是私有的,即不能直接访问。
  56. // 通过调用 setAccessible(true),我们可以绕过访问修饰符的限制来访问那些通常不可访问的成员。
  57. field.setAccessible(true);
  58. // 判断 [键] 字段名匹配时,设置 [键值]
  59. String fieldPrimaryKey = fieldPrimary.keySet().iterator().next();
  60. if (fields.get(i).equals(fieldPrimaryKey)) {
  61. translation.put(fields.get(i), fieldPrimary.get(fieldPrimaryKey));
  62. } else {
  63. translation.put(fields.get(i), field.get(trans));
  64. }
  65. } catch (NoSuchFieldException | IllegalAccessException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. return translation;
  70. }).collect(Collectors.toList());
  71. return result;
  72. } catch (NoSuchFieldException e) {
  73. // 处理字段不存在的情况
  74. e.printStackTrace();
  75. return result;
  76. } catch (IllegalAccessException e) {
  77. // 处理无法访问字段的异常
  78. e.printStackTrace();
  79. return result;
  80. }
  81. }
  82. // public <T> List<Map<String, Object>> getTranslationsField(Map<String, Object> fieldPrimary, List<T> translations, Class<?> cls) {
  83. // List<String> fields = getFieldNames(cls);
  84. // return translations.stream().map(trans -> {
  85. // Map<String, Object> translation = new HashMap<>();
  86. // for (int i = 0; i < fields.size(); i++) {
  87. // try {
  88. // Field field = trans.getClass().getDeclaredField(fields.get(i));
  89. // // 默认情况下,Java 中的成员变量和方法是私有的,即不能直接访问。
  90. // // 通过调用 setAccessible(true),我们可以绕过访问修饰符的限制来访问那些通常不可访问的成员。
  91. // field.setAccessible(true);
  92. // // 判断 [键] 字段名匹配时,设置 [键值]
  93. // String fieldPrimaryKey = fieldPrimary.keySet().iterator().next();
  94. // if (fields.get(i).equals(fieldPrimaryKey)) {
  95. // translation.put(fields.get(i), fieldPrimary.get(fieldPrimaryKey));
  96. // } else {
  97. // translation.put(fields.get(i), field.get(trans));
  98. // }
  99. // } catch (NoSuchFieldException | IllegalAccessException e) {
  100. // e.printStackTrace();
  101. // }
  102. // }
  103. // return translation;
  104. // }).collect(Collectors.toList());
  105. // }
  106. /**
  107. * 获得实体类的字段名集合
  108. * List<String> fields = languageUtil.getFieldNames(CmsArticleTranslationsDTO.class);
  109. */
  110. public List<String> getFieldNames(Class<?> cls) {
  111. List<String> fieldNames = new ArrayList<>();
  112. Field[] fields = cls.getDeclaredFields();
  113. for (Field field : fields) {
  114. field.setAccessible(true);
  115. fieldNames.add(field.getName());
  116. }
  117. return fieldNames;
  118. }
  119. }