MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

स्प्रिंग-मोंगोडब भंडारण/पुनर्प्राप्त करने वाले एनमों को int स्ट्रिंग के रूप में नहीं

स्प्रिंग-मोंगोडब कन्वर्टर कोड में एक लंबी खुदाई के बाद, ठीक है, मैं समाप्त हो गया और अब यह काम कर रहा है :) यहाँ यह है (यदि सरल समाधान है तो मुझे भी खुशी होगी, मैंने यही किया है):

पहले परिभाषित करें:

public interface IntEnumConvertable {
      public int getValue();    
}

और एक साधारण एनम जो इसे लागू करता है:

public enum tester implements IntEnumConvertable{   
    vali(0),secondvali(1),thirdvali(5);

    private final int val;
    private tester(int num)
    {
        val = num;          
    }
    public int getValue(){
        return val;
    }
}

ठीक है, अब आपको 2 कन्वर्टर्स की आवश्यकता होगी, एक सरल है, दूसरा अधिक जटिल है। सरल एक (यह साधारण बच्चा भी सरल रूपांतरण को संभाल रहा है और कास्ट संभव नहीं होने पर एक स्ट्रिंग देता है, यह बहुत अच्छा है यदि आप एनम को स्ट्रिंग्स के रूप में संग्रहीत करना चाहते हैं और एनम के लिए जो पूर्णांक के रूप में संग्रहीत किए जाने वाले नंबर हैं):

public class IntegerEnumConverters {
    @WritingConverter
    public static class EnumToIntegerConverter implements Converter<Enum<?>, Object> {
        @Override
        public Object convert(Enum<?> source) {
            if(source instanceof IntEnumConvertable)
            {
                return ((IntEnumConvertable)(source)).getValue();
            }
            else
            {
                return source.name();
            }               
        }
    }   
 }

अधिक जटिल एक, वास्तव में एक कनवर्टर कारखाना है:

public class IntegerToEnumConverterFactory implements ConverterFactory<Integer, Enum> {
        @Override
        public <T extends Enum> Converter<Integer, T> getConverter(Class<T> targetType) {
            Class<?> enumType = targetType;
            while (enumType != null && !enumType.isEnum()) {
                enumType = enumType.getSuperclass();
            }
            if (enumType == null) {
                throw new IllegalArgumentException(
                        "The target type " + targetType.getName() + " does not refer to an enum");
            }
            return new IntegerToEnum(enumType);
        }
        @ReadingConverter
        public static class IntegerToEnum<T extends Enum>  implements Converter<Integer, Enum> {
            private final Class<T> enumType;

            public IntegerToEnum(Class<T> enumType) {
                this.enumType = enumType;
            }

            @Override
            public Enum convert(Integer source) {
                  for(T t : enumType.getEnumConstants()) {
                      if(t instanceof IntEnumConvertable)
                      {
                          if(((IntEnumConvertable)t).getValue() == source.intValue()) {
                                return t;
                            }                         
                      }                     
                    }
                    return null;   
            }
        }
}

और अब हैक भाग के लिए, मुझे व्यक्तिगत रूप से एक mongoConverter के भीतर कनवर्टर फैक्ट्री को पंजीकृत करने के लिए कोई "प्रोग्राममिटैकली" तरीका नहीं मिला, इसलिए मैंने कोड में खुदाई की और थोड़ी कास्टिंग के साथ, यहां यह है (इस 2 बच्चों के कार्यों को अपने @ कॉन्फ़िगरेशन में रखें क्लास)

      @Bean
        public CustomConversions customConversions() {
            List<Converter<?, ?>> converters = new ArrayList<Converter<?, ?>>();
            converters.add(new IntegerEnumConverters.EnumToIntegerConverter());     
// this is a dummy registration , actually it's a work-around because
// spring-mongodb doesnt has the option to reg converter factory.
// so we reg the converter that our factory uses. 
converters.add(new IntegerToEnumConverterFactory.IntegerToEnum(null));      
            return new CustomConversions(converters);
        }

    @Bean
    public MappingMongoConverter mappingMongoConverter() throws Exception {
        MongoMappingContext mappingContext = new MongoMappingContext();
        mappingContext.setApplicationContext(appContext);
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory());
        MappingMongoConverter mongoConverter = new MappingMongoConverter(dbRefResolver, mappingContext);        
        mongoConverter.setCustomConversions(customConversions());       
        ConversionService convService = mongoConverter.getConversionService();
        ((GenericConversionService)convService).addConverterFactory(new IntegerToEnumConverterFactory());                  
        mongoConverter.afterPropertiesSet();
        return mongoConverter;
    } 


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB में डेटाबेस को हटाने के 2 तरीके

  2. कैसे HideIndex () MongoDB में काम करता है

  3. pymongo के साथ एडब्ल्यूएस से कनेक्ट करते समय ServerSelectionTimeoutError

  4. क्या मैं MongoDB में कुल क्वेरी में प्रत्येक के लिए आवेदन कर सकता हूं?

  5. मैक ओएस 10.12 पर मोंगोडब स्थापित करने में असमर्थ