বসন্ত: মানচিত্র বা সম্পত্তি সম্পত্তি হিসাবে সমস্ত পরিবেশের বৈশিষ্ট্য অ্যাক্সেস করুন


86

আমি আমার বসন্তের পরিবেশটি এটির মতো কনফিগার করতে টীকাগুলি ব্যবহার করছি:

@Configuration
...
@PropertySource("classpath:/config/default.properties")
...
public class GeneralApplicationConfiguration implements WebApplicationInitializer 
{
    @Autowired
    Environment env;
}

এটি আমার সম্পত্তিগুলির default.propertiesঅংশ হতে বাড়ে Environment। আমি @PropertySourceএখানে মেকানিজমটি ব্যবহার করতে চাই , কারণ এটি ইতিমধ্যে পরিবেশের সেটিংসের (যেমন কনফিগার_ডির অবস্থান) উপর ভিত্তি করে বিভিন্ন ফলব্যাক স্তর এবং বিভিন্ন গতিশীল অবস্থানের মাধ্যমে সম্পত্তিগুলি ওভারলোডের সম্ভাবনা সরবরাহ করে। উদাহরণটি আরও সহজ করতে আমি ফ্যালব্যাকটি ছিনিয়ে নিয়েছি।

তবে, এখন আমার সমস্যাটি হ'ল আমি উদাহরণস্বরূপ আমার ডেটাসোর্স বৈশিষ্ট্যগুলিতে কনফিগার করতে চাই default.properties। আপনি কী সেটিংস ব্যবহার করে ডেটাসোর্সটি আশা করে তা না জেনে আপনি সেটিংসটি ডেটাসোর্সে পাস করতে পারেন

Properties p = ...
datasource.setProperties(p);

তবে সমস্যাটি হ'ল, Environmentবস্তুটি না কোনও Propertiesবস্তু এবং Mapনা কোনও কিছু তুলনীয়। আমার দৃষ্টিকোণ থেকে পরিবেশের সমস্ত মূল্যবোধ অ্যাক্সেস করা সহজভাবে সম্ভব নয়, কারণ এর সাথে তুলনীয় কোনও keySetবা iteratorপদ্ধতি বা কোনও কিছুই নেই।

Properties p <=== Environment env?

আমি কিছু অনুপস্থিত করছি? Environmentকোনওভাবে কি অবজেক্টের সমস্ত প্রবেশাধিকার অ্যাক্সেস করা সম্ভব ? যদি হ্যাঁ, আমি কোনও কোনও Mapবা Propertiesবস্তুর প্রবেশের মানচিত্র রাখতে পারি, এমনকি আমি এগুলি উপসর্গ দ্বারা ফিল্টার করতে বা ম্যাপ করতে পারি - একটি মানক জাভা হিসাবে সাবসেট তৈরি Mapকরতে পারি ... এটিই আমি করতে চাই। কোনও পরামর্শ?

উত্তর:


75

আপনার এই জাতীয় কিছু প্রয়োজন, সম্ভবত এটি উন্নত করা যেতে পারে। এটি প্রথম চেষ্টা:

...
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
...

@Configuration
...
@org.springframework.context.annotation.PropertySource("classpath:/config/default.properties")
...
public class GeneralApplicationConfiguration implements WebApplicationInitializer 
{
    @Autowired
    Environment env;

    public void someMethod() {
        ...
        Map<String, Object> map = new HashMap();
        for(Iterator it = ((AbstractEnvironment) env).getPropertySources().iterator(); it.hasNext(); ) {
            PropertySource propertySource = (PropertySource) it.next();
            if (propertySource instanceof MapPropertySource) {
                map.putAll(((MapPropertySource) propertySource).getSource());
            }
        }
        ...
    }
...

মূলত, পরিবেশের সমস্ত কিছু যা MapPropertySource(এবং বেশ কয়েকটি বাস্তবায়ন রয়েছে) Mapবৈশিষ্ট্য হিসাবে ব্যবহার করা যেতে পারে ।


এই পদ্ধতির ভাগ করে নেওয়ার জন্য ধন্যবাদ। আমি এটাকে কিছুটা "নোংরা" হিসাবে বিবেচনা করছি তবে সম্ভবত এখানে যাওয়ার একমাত্র উপায় এটি। একজন সহকর্মী আমাকে যে অন্য পদ্ধতির দেখিয়েছেন তা হ'ল একটি স্থিত কী ব্যবহার করে কনফিগারেশনে কোনও সম্পত্তি রেখে দেওয়া যা সমস্ত সম্পত্তি কী সহ একটি তালিকা রাখে। তারপরে আপনি কী-লিস্টের উপর ভিত্তি করে মানচিত্র / বৈশিষ্ট্যগুলির বস্তুতে বৈশিষ্ট্যগুলি পড়তে পারেন। এটি অন্তত
ক্যাসেটগুলি

20
স্প্রিং বুটের জন্য দ্রষ্টব্য ... যে প্রপার্টিসোর্সগুলি () প্রপার্টিসোর্সকে অগ্রাধিকার ক্রমে রিটার্ন দেয় যাতে আপনার কার্যকরভাবে বিপরীত হওয়া দরকার যেখানে সম্পত্তি মানগুলি ওভাররাইট করা হয়
রব বায়গ্রাভ

4
@ রববাইগ্রাভ উল্লেখ করেছেন যে আদেশটি ভিন্ন হতে পারে, তবে আদেশটি পরিবর্তনের পরিবর্তে (যেহেতু আপনি যুদ্ধ হিসাবে ধারক হিসাবে বসন্ত বুট স্থাপন করতে পারেন বা ভবিষ্যতে এই আচরণ পরিবর্তন হতে পারে) আমি কেবল সমস্ত চাবি সংগ্রহ করব এবং তারপরে সমাধানের জন্য ব্যবহার applicationContext.getEnvironment().getProperty(key)করব
আলু

@ পোটাটো এটি একটি ভাল ধারণা, এবং আমি এটি চেষ্টা করেছি। : শুধুমাত্র সম্ভাব্য সমস্যার আপনি স্থানধারকসহ মূল্যায়ন সমস্যার সম্মুখীন হন, এই প্রশ্ন এখানে ভালো হয় stackoverflow.com/questions/34584498/...
bischoje

4
ধন্যবাদ! .. আমি org.apache.ibatis.io.Resource.getResourceAsProperties ("ফাইলপথ") এর জায়গায় ব্যবহারের জন্য একটি বসন্ত বিকল্পের সন্ধান করছিলাম এই সমাধানটি আমার পক্ষে খুব ভালভাবে কাজ করেছে।
তাই-এলোমেলো-বউ

69

এটি একটি পুরানো প্রশ্ন, তবে স্বীকৃত উত্তরের একটি গুরুতর ত্রুটি রয়েছে। যদি স্প্রিং Environmentঅবজেক্টে কোনও ওভাররাইডিং মান থাকে ( বহিরাগত কনফিগারেশনে বর্ণিত ), কোনও গ্যারান্টি নেই যে তার উত্পাদিত সম্পত্তি মানের মানচিত্রটি সেই Environmentবস্তু থেকে ফিরে আসাগুলির সাথে মেলে । আমি দেখতে পেয়েছি যে কেবলমাত্র PropertySources এর মাধ্যমে পুনরাবৃত্তি Environmentআসলে কোনও ওভাররাইডিং মান দেয় না। পরিবর্তে এটি আসল মানটি উত্পন্ন করে, একটি যেটি ওভাররাইড করা উচিত ছিল।

এখানে একটি আরও ভাল সমাধান। এটি পরিচিত সম্পত্তি নামের মাধ্যমে পুনরাবৃত্তি করতে EnumerablePropertySourceএর গুলি ব্যবহার করে Environmentতবে তার পরে আসল মানটি আসল বসন্তের পরিবেশের বাইরে পড়ে। এটি গ্যারান্টি দেয় যে মানটি হ'ল মূলত বসন্তের দ্বারা সমাধান করা, কোনও ওভাররাইডিং মান সহ।

Properties props = new Properties();
MutablePropertySources propSrcs = ((AbstractEnvironment) springEnv).getPropertySources();
StreamSupport.stream(propSrcs.spliterator(), false)
        .filter(ps -> ps instanceof EnumerablePropertySource)
        .map(ps -> ((EnumerablePropertySource) ps).getPropertyNames())
        .flatMap(Arrays::<String>stream)
        .forEach(propName -> props.setProperty(propName, springEnv.getProperty(propName)));

4
এটি লক্ষণীয় যে স্প্রিং ৪.১.২-এর হিসাবে, এই সমাধানটি (অন্যান্য উত্তরগুলির মত নয়) কমপোজিটপ্রোপার্টিসোর্সটি স্পষ্টভাবে ডিল করার জন্য আপডেট করার দরকার নেই, কারণ কমপোজিটপ্রোপার্টিসোর্স এনামিউরেবলপ্রোটিসোর্সকে প্রসারিত করে এবং তাই getPropertyNames সম্মিলনের সমস্ত সম্পত্তি নামের সেটটি ফিরিয়ে দেবে উৎস.
এম জাস্টিন

4
এছাড়াও আপনি ব্যবহার করে বৈশিষ্ট্যের সংগ্রহ করতে পারে বিল্ট-ইন collectএর পরিবর্তে একটি করছেন প্রবাহে পদ্ধতি forEach: .distinct().collect(Collectors.toMap(Function.identity(), springEnv::getProperty))। আপনার যদি মানচিত্রের পরিবর্তে কোনও প্রোপার্টিগুলিতে সংগ্রহ করার দরকার হয় আপনি এর চার-যুক্তির সংস্করণ ব্যবহার করতে পারেন collect
এম জাস্টিন

4
কি springEnv? যেখানে এটি থেকে আসে? এটি কি envগ্রহণযোগ্য সমাধানের থেকে পৃথক হয় ?
sebnukem

4
@ Sebnukem ভাল পয়েন্ট। springEnvহয় envমূল প্রশ্ন & গৃহীত সমাধান অবজেক্ট। আমি মনে করি আমার নামটি একই রাখা উচিত ছিল।
পেডোরো

4
আপনি ব্যবহার করতে পারেন ConfigurableEnvironment এবং use ালাই করতে হবে না।
অভিজিৎ সরকার

19

আমার সমস্ত বৈশিষ্ট্য পুনরুদ্ধার করার প্রয়োজন ছিল যার মূল কীটি একটি পৃথক উপসর্গ দিয়ে শুরু হয় (উদাহরণস্বরূপ "log4j.appender।" দিয়ে শুরু হওয়া সমস্ত সম্পত্তি) এবং নিম্নলিখিত কোডটি লিখেছিলেন (জাভা 8 এর স্ট্রিম এবং লামদাস ব্যবহার করে)।

public static Map<String,Object> getPropertiesStartingWith( ConfigurableEnvironment aEnv,
                                                            String aKeyPrefix )
{
    Map<String,Object> result = new HashMap<>();

    Map<String,Object> map = getAllProperties( aEnv );

    for (Entry<String, Object> entry : map.entrySet())
    {
        String key = entry.getKey();

        if ( key.startsWith( aKeyPrefix ) )
        {
            result.put( key, entry.getValue() );
        }
    }

    return result;
}

public static Map<String,Object> getAllProperties( ConfigurableEnvironment aEnv )
{
    Map<String,Object> result = new HashMap<>();
    aEnv.getPropertySources().forEach( ps -> addAll( result, getAllProperties( ps ) ) );
    return result;
}

public static Map<String,Object> getAllProperties( PropertySource<?> aPropSource )
{
    Map<String,Object> result = new HashMap<>();

    if ( aPropSource instanceof CompositePropertySource)
    {
        CompositePropertySource cps = (CompositePropertySource) aPropSource;
        cps.getPropertySources().forEach( ps -> addAll( result, getAllProperties( ps ) ) );
        return result;
    }

    if ( aPropSource instanceof EnumerablePropertySource<?> )
    {
        EnumerablePropertySource<?> ps = (EnumerablePropertySource<?>) aPropSource;
        Arrays.asList( ps.getPropertyNames() ).forEach( key -> result.put( key, ps.getProperty( key ) ) );
        return result;
    }

    // note: Most descendants of PropertySource are EnumerablePropertySource. There are some
    // few others like JndiPropertySource or StubPropertySource
    myLog.debug( "Given PropertySource is instanceof " + aPropSource.getClass().getName()
                 + " and cannot be iterated" );

    return result;

}

private static void addAll( Map<String, Object> aBase, Map<String, Object> aToBeAdded )
{
    for (Entry<String, Object> entry : aToBeAdded.entrySet())
    {
        if ( aBase.containsKey( entry.getKey() ) )
        {
            continue;
        }

        aBase.put( entry.getKey(), entry.getValue() );
    }
}

মনে রাখবেন যে প্রারম্ভিক বিন্দুটি হ'ল কনফিগারযোগ্য পরিবেশ যা এম্বেড থাকা সম্পত্তি সম্পদগুলি ফিরিয়ে দিতে সক্ষম (কনফিগারযোগ্য পরিবেশটি পরিবেশের প্রত্যক্ষ বংশধর)। আপনি এটি দ্বারা স্বীকৃতি দিতে পারেন:

@Autowired
private ConfigurableEnvironment  myEnv;

যদি আপনি খুব বিশেষ ধরণের সম্পত্তি উত্স ব্যবহার না করেন (যেমন ঝেন্ডিপ্রপার্টিসোর্স, যা সাধারণত বসন্তের স্বতঃরূপকরণে ব্যবহৃত হয় না) আপনি পরিবেশে থাকা সমস্ত সম্পত্তি পুনরুদ্ধার করতে পারেন।

বাস্তবায়নটি পুনরাবৃত্তির ক্রমের উপর নির্ভর করে যা বসন্ত নিজেই প্রদান করে এবং প্রথম পাওয়া সম্পত্তি গ্রহণ করে, পরে একই নামযুক্ত সমস্ত বৈশিষ্ট্য বাতিল করা হয়। এটি একই আচরণটিকে নিশ্চিত করা উচিত যেমন পরিবেশের কাছে কোনও সম্পত্তির জন্য সরাসরি জিজ্ঞাসা করা হয়েছিল (প্রথম পাওয়া কোনওটিকে ফিরে দেওয়া)।

এও নোট করুন যে ফেরত বৈশিষ্ট্যগুলি এখনও not {... al অপারেটরের সাথে উপমা রাখলে এখনও সমাধান হয়নি। আপনি যদি কোনও নির্দিষ্ট কী সমাধান করতে চান তবে আপনাকে সরাসরি পরিবেশটিকে আবার জিজ্ঞাসা করতে হবে:

myEnv.getProperty( key );

4
কেন কেবল এই জাতীয় সমস্ত কীগুলি আবিষ্কার করুন এবং তারপরে উপযুক্ত মানের সমাধানের জন্য এনভায়রনমেন্ট.টেট প্রপার্টিটি ব্যবহার করবেন না? পরিবেশের ওভাররাইডগুলি সম্মানিত হয়েছে তা নিশ্চিত করতে চাইবেন, যেমন অ্যাপ্লিকেশন- ডিভাইস।
গেমসলুটস

এটিই আমি শেষ অনুচ্ছেদে নির্দেশ করেছি। Env.getProperty ব্যবহার করে বসন্তের আসল আচরণ নিশ্চিত করে।
হেরি

আপনি এই ইউনিট পরীক্ষা কিভাবে? আমি সবসময় পেতে NullPointerExceptionআমার ইউনিট পরীক্ষা যখন এটি পেতে চেষ্টা করে @Autowiredদৃষ্টান্ত ConfigurationEnvironment
আর্টঅফ ওয়ারফেয়ার

আপনি কি নিশ্চিতভাবেই আপনার পরীক্ষাটি বসন্তের অ্যাপ্লিকেশন হিসাবে চালিয়েছেন?
হেরি

আমি এটি এর মতো করি:
হেরি

10

মূল প্রশ্নটি ইঙ্গিত দিয়েছিল যে একটি উপসর্গের উপর ভিত্তি করে সমস্ত বৈশিষ্ট্য ফিল্টার করতে সক্ষম হওয়াই ভাল লাগবে। আমি শুধু নিশ্চিত করেছে যে এই বসন্ত বুট 2.1.1.RELEASE হিসাবে কাজ করে, জন্য আছে Properties বা Map<String,String> । আমি নিশ্চিত যে এটি আপাতত কাজ করেছে। মজার বিষয় হল, এটি prefix =যোগ্যতা ব্যতীত কাজ করে না , অর্থাত্ কীভাবে পুরো পরিবেশটি কোনও মানচিত্রে লোড করা যায় তা আমি জানি না । আমি যেমন বলেছি, এটি আসলে ওপি দিয়ে শুরু করতে চেয়েছিল। উপসর্গ এবং নিম্নলিখিত '। ছিনতাই হয়ে যাবে, যা হয়ত যা চায় বা নাও পারে:

@ConfigurationProperties(prefix = "abc")
@Bean
public Properties getAsProperties() {
    return new Properties();
}

@Bean
public MyService createService() {
    Properties properties = getAsProperties();
    return new MyService(properties);
}

পোস্টস্ক্রিপ্ট: পুরো পরিবেশটি পাওয়া সত্যিই সম্ভব এবং লজ্জাজনকভাবে সহজ। আমি জানি না কীভাবে এই আমাকে পলায়ন করেছে:

@ConfigurationProperties
@Bean
public Properties getProperties() {
    return new Properties();
}

4
এছাড়াও, abc = x এর মতো বৈশিষ্ট্যগুলি {b = {c = x}}
নেমে আসে

এই কাজের কোনও অংশ নেই - getAsProperties()সর্বদা একটি খালি Propertiesদৃষ্টান্ত দেয় এবং নির্দিষ্ট উপসর্গ ব্যতীত চেষ্টা করেও এটি সংকলনের অনুমতি দেয় না। এটি স্প্রিং বুট সহ
2.1.6.

4
আমি কাজ করে জাভা লিখছি না, তবে আমি খুব তাড়াতাড়ি বেত্রাঘাত করেছি: github.com/AbuCarlo/SpringPropertiesBean । এটি সম্ভবত সম্ভব না যে আপনি যদি কোনওভাবে বসন্তের প্রারম্ভিক ক্রমকে ঘুরিয়ে দেন (যেমন "বৈশিষ্ট্যগুলি" শিমটি কখনই জনবহুল হয় না)। এটি জাভা 8, স্প্রিং 2.2.6 এর জন্য।
আবু নাসার

5

এই বসন্তের জিরা টিকিট হিসাবে এটি একটি ইচ্ছাকৃত নকশা। তবে নীচের কোডটি আমার পক্ষে কাজ করে।

public static Map<String, Object> getAllKnownProperties(Environment env) {
    Map<String, Object> rtn = new HashMap<>();
    if (env instanceof ConfigurableEnvironment) {
        for (PropertySource<?> propertySource : ((ConfigurableEnvironment) env).getPropertySources()) {
            if (propertySource instanceof EnumerablePropertySource) {
                for (String key : ((EnumerablePropertySource) propertySource).getPropertyNames()) {
                    rtn.put(key, propertySource.getProperty(key));
                }
            }
        }
    }
    return rtn;
}

2

বসন্ত java.util.Propertiesবসন্ত পরিবেশের মাধ্যমে ডিকুয়াল করতে দেয় না ।

তবে Properties.load()এখনও একটি স্প্রিং বুট অ্যাপ্লিকেশনটিতে কাজ করে:

Properties p = new Properties();
try (InputStream is = getClass().getResourceAsStream("/my.properties")) {
    p.load(is);
}

1

অন্যান্য উত্তরগুলি জড়িত বেশিরভাগ মামলার সমাধানের দিকে ইঙ্গিত করেছে PropertySources , তবে কেউ উল্লেখ করেনি যে নির্দিষ্ট সম্পত্তি উত্সগুলি দরকারী ধরণের হতে অক্ষম।

যেমন একটি উদাহরণ কমান্ড লাইন আর্গুমেন্ট জন্য সম্পত্তি উত্স। যে ক্লাসটি ব্যবহৃত হয় তা হ'ল SimpleCommandLinePropertySource। এই ব্যক্তিগত ক্লাসটি জনসাধারণের দ্বারা ফিরিয়ে দেওয়া হয়েছে পদ্ধতিতে , সুতরাং এটি অবজেক্টের অভ্যন্তরে ডেটা অ্যাক্সেস করা অত্যন্ত জটিল করে তোলে। ডেটা পড়তে এবং শেষ পর্যন্ত সম্পত্তির উত্স প্রতিস্থাপনের জন্য আমাকে প্রতিবিম্বটি ব্যবহার করতে হয়েছিল।

এর বাইরে কারও যদি এর থেকে আরও ভাল সমাধান হয় তবে আমি সত্যিই এটি দেখতে চাই; যাইহোক, আমি কাজ করতে করতে পেলাম এই একমাত্র হ্যাক।


আপনি কি সরকারী-শ্রেণীর সাথে সমস্যার সমাধান খুঁজে পেয়েছেন?
টোবিয়াস

1

স্প্রিং বুট 2 এর সাথে কাজ করা, আমারও অনুরূপ কিছু করা দরকার। উপরের উত্তরগুলির বেশিরভাগই সূক্ষ্মভাবে কাজ করে, কেবল সাবধান যে অ্যাপের বিভিন্ন পর্যায়ে লাইফ সাইকেলের ফলাফলগুলি ভিন্ন হবে।

উদাহরণস্বরূপ, ApplicationEnvironmentPreparedEventঅভ্যন্তরের কোনও বৈশিষ্ট্য application.propertiesউপস্থিত থাকার পরে নেই। তবে, একটি ApplicationPreparedEventইভেন্টের পরে তারা হলেন।


1

স্প্রিং বুটের জন্য, গৃহীত উত্তরটি নিম্ন অগ্রাধিকারযুক্ত সদৃশ বৈশিষ্ট্যগুলিকে মুছে ফেলবে । এই সমাধানটি একটিতে সম্পত্তি সংগ্রহ করবে SortedMapএবং কেবলমাত্র সর্বোচ্চ অগ্রাধিকারের সদৃশ বৈশিষ্ট্য গ্রহণ করবে।

final SortedMap<String, String> sortedMap = new TreeMap<>();
for (final PropertySource<?> propertySource : env.getPropertySources()) {
    if (!(propertySource instanceof EnumerablePropertySource))
        continue;
    for (final String name : ((EnumerablePropertySource<?>) propertySource).getPropertyNames())
        sortedMap.computeIfAbsent(name, propertySource::getProperty);
}

env.getPropertySource () সর্বনিম্ন থেকে সর্বোচ্চ অগ্রাধিকারে সম্পত্তি দেয়?
ফারাজ 23

এটা অন্য রাস্তা। এগুলি উচ্চ -> নিম্ন অগ্রাধিকার থেকে বাছাই করা হয়।
স্যামুয়েল তটিপামুলা

0

যদিও আমি আরও একটি উপায় যুক্ত করব। আমার ক্ষেত্রে আমি এটি সরবরাহ করি com.hazelcast.config.XmlConfigBuilderযা কেবলমাত্র java.util.Propertiesহ্যাজেলকাস্ট এক্সএমএল কনফিগারেশন ফাইলের অভ্যন্তরে কিছু সম্পত্তি সমাধান করা দরকার , এটি কেবল getProperty(String)পদ্ধতিটিকে কল করে । সুতরাং, এটি আমার যা প্রয়োজন তা করার অনুমতি দেয়:

@RequiredArgsConstructor
public class SpringReadOnlyProperties extends Properties {

  private final org.springframework.core.env.Environment delegate;

  @Override
  public String getProperty(String key) {
    return delegate.getProperty(key);
  }

  @Override
  public String getProperty(String key, String defaultValue) {
    return delegate.getProperty(key, defaultValue);
  }

  @Override
  public synchronized String toString() {
    return getClass().getName() + "{" + delegate + "}";
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    if (!super.equals(o)) return false;
    SpringReadOnlyProperties that = (SpringReadOnlyProperties) o;
    return delegate.equals(that.delegate);
  }

  @Override
  public int hashCode() {
    return Objects.hash(super.hashCode(), delegate);
  }

  private void throwException() {
    throw new RuntimeException("This method is not supported");
  }

  //all methods below throw the exception

  * override all methods *
}

PS আমি হ্যাজেলকাস্টের জন্য এটি বিশেষভাবে ব্যবহার না করে শেষ করেছি কারণ এটি কেবল এক্সএমএল ফাইলের জন্য বৈশিষ্ট্যগুলি সমাধান করে তবে রানটাইমগুলিতে নয়। যেহেতু আমি স্প্রিংটিও ব্যবহার করি, তাই আমি একটি রীতিনীতি নিয়ে যাওয়ার সিদ্ধান্ত নিয়েছি org.springframework.cache.interceptor.AbstractCacheResolver#getCacheNames। এটি উভয় অবস্থার জন্য বৈশিষ্ট্যগুলি সমাধান করে, কমপক্ষে যদি আপনি ক্যাশে নামে সম্পত্তি ব্যবহার করেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.