जैक्सन और लोम्बोक को एक साथ काम नहीं कर सकते


97

मैं जैक्सन और लोम्बोक के संयोजन में प्रयोग कर रहा हूं। वे मेरी कक्षाएं हैं:

package testelombok;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;
import lombok.experimental.Wither;

@Value
@Wither
@AllArgsConstructor(onConstructor=@__(@JsonCreator))
public class TestFoo {
    @JsonProperty("xoom")
    private String x;
    private int z;
}
package testelombok;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.xebia.jacksonlombok.JacksonLombokAnnotationIntrospector;
import java.io.IOException;

public class TestLombok {

    public static void main(String[] args) throws IOException {
        TestFoo tf = new TestFoo("a", 5);
        System.out.println(tf.withX("b"));
        ObjectMapper om = new ObjectMapper().setAnnotationIntrospector(new JacksonLombokAnnotationIntrospector());
        System.out.println(om.writeValueAsString(tf));
        TestFoo tf2 = om.readValue(om.writeValueAsString(tf), TestFoo.class);
        System.out.println(tf2);
    }

}

वे JAR हैं जिन्हें मैं कक्षा में जोड़ रहा हूं:

मैं इसे नेटबीन्स के साथ संकलित कर रहा हूं (मुझे नहीं लगता कि यह वास्तव में प्रासंगिक है, लेकिन मैं इसे पूरी तरह से और ईमानदारी से प्रतिलिपि प्रस्तुत करने योग्य बनाने के लिए वैसे भी रिपोर्ट कर रहा हूं)। उपरोक्त पाँच JAR को एक फ़ोल्डर में रखा जाता है, जिसे " libप्रोजेक्ट फ़ोल्डर के अंदर" (" src", " nbproject", " test" और " build") के साथ रखा जाता है। मैंने उन्हें प्रोजेक्ट गुणों में " ऐड जार / फोल्डर " बटन के माध्यम से नेटबीन्स में जोड़ा और वे ऊपर की सूची के रूप में सटीक क्रम में सूचीबद्ध हैं। परियोजना एक मानक "जावा एप्लिकेशन" प्रकार की परियोजना है।

इसके अलावा, नेटबींस परियोजना को " सेव पर संकलित न करें ", " डीबगिंग जानकारी उत्पन्न करें ", " रिपोर्ट अपग्रेड किए गए एपीआई ", " ट्रैक जावा निर्भरता ", " एक्टिवेट एनोटेशन प्रोसेडिंग " और " एक्टिक्टेट एनोटेशन एडिटरिंग प्रॉफ़िटिंग फ़ॉर एडिटरिंग " में कॉन्फ़िगर किया गया है । कोई एनोटेशन प्रोसेसर या एनोटेशन प्रोसेसिंग विकल्प स्पष्ट रूप से नेटबीन्स में कॉन्फ़िगर नहीं किया गया है। साथ ही, -Xlint:allकंपाइलर कमांड लाइन में " " कमांड लाइन विकल्प पास किया गया है, और कंपाइलर बाहरी वीएम पर चलता है।

मेरे जावा का संस्करण 1.8.0_72 है और मेरे जावा का संस्करण 1.8.0_72-b15 है। मेरा नेटबीन्स 8.1 है।

मेरा प्रोजेक्ट ठीक संकलित है। हालांकि, यह इसके निष्पादन में एक अपवाद फेंकता है। अपवाद कुछ भी नहीं लगता है जो आसानी से या स्पष्ट रूप से देखने योग्य है। यहाँ स्टैकट्रेस सहित आउटपुट है:

TestFoo(x=b, z=5)
{"z":5,"xoom":"a"}
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
 at [Source: {"z":5,"xoom":"a"}; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:296)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:475)
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3785)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
    at testelombok.TestLombok.main(TestLombok.java:14)
Caused by: java.lang.IllegalArgumentException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addDeserializerConstructors(BasicDeserializerFactory.java:511)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:323)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:253)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:219)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:141)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:406)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
    ... 7 more

मैंने पहले से ही बेतरतीब ढंग से प्रहार के साथ @Valueऔर @AllArgsConstructorएनोटेशन के बारे में कोशिश की , लेकिन मैं इसे बेहतर नहीं बना सका।

मैंने अपवाद को google किया और जैकसन पर एक पुरानी बग रिपोर्ट पाई , और एक और जो खुली है, लेकिन लगता है कि वह किसी और चीज़ से संबंधित है । हालांकि, यह अभी भी कुछ भी नहीं बताता है कि यह बग क्या है या इसे कैसे ठीक किया जाए। इसके अलावा, मुझे कुछ भी उपयोगी नहीं लग रहा था जो कहीं और है।

चूँकि मैं जो करने की कोशिश कर रहा हूँ, वह है लोमबोक और जैक्सन दोनों का बहुत बुनियादी उपयोग, यह अजीब लगता है कि मुझे इस समस्या को हल करने के तरीके के बारे में कोई और उपयोगी जानकारी नहीं मिली। शायद मुझे कुछ याद आया?

केवल यह कहने के अलावा कि " लोबोक का उपयोग न करें " या " जैकसन का उपयोग न करें ", क्या किसी को इस बारे में कोई विचार नहीं है कि इसे कैसे हल किया जाए?

जवाबों:


59

यदि आप अपरिवर्तनीय चाहते हैं, लेकिन लैंसोक और जैकसन का उपयोग करते हुए एक json serializable POJO। अपने lomboks बिल्डर पर जैकसन नए एनोटेशन का उपयोग करें @JsonPOJOBuilder(withPrefix = "") मैंने इस समाधान की कोशिश की और यह बहुत अच्छी तरह से काम करता है। नमूना उपयोग

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import lombok.Builder;
import lombok.Value;

@JsonDeserialize(builder = Detail.DetailBuilder.class)
@Value
@Builder
public class Detail {

    private String url;
    private String userName;
    private String password;
    private String scope;

    @JsonPOJOBuilder(withPrefix = "")
    public static class DetailBuilder {

    }
}

यदि आपके पास बहुत अधिक कक्षाएं हैं @Builderऔर आप नहीं चाहते हैं कि बॉयलरप्लेट कोड खाली एनोटेशन हो तो आप एनोटेशन इंटरसेप्टर को खाली कर सकते हैंwithPrefix

mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
        @Override
        public JsonPOJOBuilder.Value findPOJOBuilderConfig(AnnotatedClass ac) {
            if (ac.hasAnnotation(JsonPOJOBuilder.class)) {//If no annotation present use default as empty prefix
                return super.findPOJOBuilderConfig(ac);
            }
            return new JsonPOJOBuilder.Value("build", "");
        }
    });

और आप @JsonPOJOBuilderएनोटेशन के साथ खाली बिल्डर वर्ग को हटा सकते हैं।


किसी समाधान के लिए लिंक का स्वागत है, लेकिन कृपया सुनिश्चित करें कि आपका उत्तर इसके बिना उपयोगी है: लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चले कि यह क्या है और यह क्यों है, तो पृष्ठ के सबसे प्रासंगिक भाग को उद्धृत करें ' मामले में लक्ष्य पृष्ठ अनुपलब्ध होने पर पुनः लिंक करना। उत्तर जो किसी लिंक से थोड़ा अधिक हैं, उन्हें हटाया जा सकता है।
geisterfurz007

यह समाधान जैक्सन के ब्रेन-डेड कंस्ट्रक्टर आधारित डिस्क्रिऐलेशन मुद्दों के आसपास काम करते समय अपरिवर्तनीयता रखता है (मल्टी-फील्ड कंस्ट्रक्टर को कुछ बुद्धिमान की कोशिश करने के बजाय, प्रत्येक कंस्ट्रक्टर तर्क पर @JsonProperty की आवश्यकता होती है)। (मैंने भाग्य के बिना _Constructor _ = {@ JsonCreator} की कोशिश की थी)
JeeBee

38

अपरिवर्तनीय + लोम्बोक + जैक्सन को अगले तरीके से प्राप्त किया जा सकता है:

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Value;

@Value
@NoArgsConstructor(force = true, access = AccessLevel.PRIVATE)
@AllArgsConstructor
public class LocationDto {

    double longitude;
    double latitude;
}

class ImmutableWithLombok {

    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        String stringJsonRepresentation = objectMapper.writeValueAsString(new LocationDto(22.11, 33.33));
        System.out.println(stringJsonRepresentation);

        LocationDto locationDto = objectMapper.readValue(stringJsonRepresentation, LocationDto.class);
        System.out.println(locationDto);
    }
}

4
क्या AllArgsConstructorपहले से ही @Valueएनोटेशन का हिस्सा नहीं है ?
ज़ोन

8
स्पष्ट रूप से जोड़ने @NoArgsConstructorवाले निर्माण को @Valueएनोटेशन द्वारा उत्पन्न किया जाता है , इसलिए आपको अतिरिक्त जोड़ना होगा@AllArgsConstructor
डेविओ

1
सर्वश्रेष्ठ समाधान मैंने पाया है - मेरी राय में - बिना बिल्डर पैटर्न के। धन्यवाद।
राडोक्सा

16

मैंने उपरोक्त कई कोशिश की और वे सभी स्वभाव के थे। मेरे लिए वास्तव में जो काम किया गया, वह उत्तर मुझे यहां मिला ।

अपनी परियोजना की मूल निर्देशिका में एक lombok.config फ़ाइल जोड़ें (यदि आपने पहले से नहीं किया है)

lombok.config

और इसे पेस्ट करें

lombok.anyConstructor.addConstructorProperties=true

तो आप निम्न की तरह अपने pojos को परिभाषित कर सकते हैं:

@Data
@AllArgsConstructor
public class MyPojo {

    @JsonProperty("Description")
    private String description;
    @JsonProperty("ErrorCode")
    private String errorCode;
}

2
लेकिन क्या यह परस्पर नहीं है?
vphilipnyc

अपरिवर्तनीय होने के लिए,
गेट्टर

इस मामले में कोई विचार क्यों मेरे काम नहीं कर रहा है? मेरे पास एक स्प्रिंग बूट एप्लिकेशन है और मैंने अपने src के अंदर lombok.config रखा है, लेकिन फिर भी आपका समाधान काम नहीं कर रहा है।
थानोस एम

8

मेरे पास एक ही मुद्दा था, suppressConstructorProperties = trueपैरामीटर को जोड़कर "हल" किया गया (आपके उदाहरण का उपयोग करके):

@Value
@Wither
@AllArgsConstructor(suppressConstructorProperties = true)
public class TestFoo {
    @JsonProperty("xoom")
    private String x;
    private int z;
}

जैक्सन स्पष्ट रूप java.beans.ConstructorProperties से निर्माणकर्ताओं के लिए जोड़ा गया एनोटेशन पसंद नहीं करता है । suppressConstructorProperties = trueपैरामीटर बताता लंबोक में जोड़ने के लिए नहीं (यह डिफ़ॉल्ट रूप से करता है)।


7
suppressConstructorPropertiesअब पदावनत कर दिया गया है :-(
lilalinux

3
जो एक समस्या नहीं है, क्योंकि नया डिफ़ॉल्ट भी है false
माइकल पीफेल

4

@AllArgsConstructor(suppressConstructorProperties = true)पदावनत किया गया है। परिभाषित करें lombok.anyConstructor.suppressConstructorProperties=true( https://projectlombok.org/features/configuration ) और परिवर्तन POJO के लंबोक एनोटेशन @Valueके लिए @Data+ @NoArgsConstructor+ @AllArgsConstructorमेरे लिए काम करता है।


14
यह वर्ग को परिवर्तनशील बनाता है, जो मुझे लगता है कि ओपी नहीं चाहता था
अमित गोल्डस्टीन

3

जन रीके के उत्तर से

1.18.4 lombok के बाद से, आप कॉन्फ़िगर कर सकते हैं कि एनोटेशन को कंस्ट्रक्टर मापदंडों पर कॉपी किया गया है। इसे अपने में डालें lombok.config:

lombok.copyableAnnotations += com.fasterxml.jackson.annotation.JsonProperty

तो बस @JsonPropertyअपने क्षेत्रों में जोड़ें :

...

नाम से मेल खाने पर भी आपको हर क्षेत्र में @JsonProperty की आवश्यकता होगी, लेकिन यह वैसे भी पालन करने के लिए एक अच्छा अभ्यास है। आप इसका उपयोग करके अपने खेतों को सार्वजनिक फाइनल में सेट कर सकते हैं, जिसे मैं गेटर्स से अधिक पसंद करता हूं।

@ToString
@EqualsAndHashCode
@Wither
@AllArgsConstructor(onConstructor=@__(@JsonCreator))
public class TestFoo {
    @JsonProperty("xoom")
    public final String x;
    @JsonProperty("z")
    public final int z;
}

हालांकि इसे गेटर्स (+ सेटलर्स) के साथ भी काम करना चाहिए।


1
यह मेरे मुद्दे को हल करता है! आपको बहुत - बहुत धन्यवाद! मैं JSON और POJOs के बीच वसंत-बूट-एकीकरण और क्रमांकन पर अटक गया और त्रुटि प्राप्त कर रहा हूं: Can not deserialize instance of java.lang.String out of START_OBJECT token... और इसने इसे ठीक कर दिया! मुझे @JsonPropertyप्रत्येक कंस्ट्रक्टर पैरामीटर के लिए उस एनोटेशन की आवश्यकता है और इसके अलावा @AllArgsConstructorलोबॉक को इंस्ट्रूमेंट करने की अनुमति देता है।
मार्क

2

मेरे लिए यह तब काम आया जब मैंने लम्बोक संस्करण को अपडेट किया है: 'org.projectlombok: lombok: 1.18.0'


1

यदि आप इसके "मिक्सिन" पैटर्न का उपयोग करते हैं, तो आपको जैक्सन के साथ कुछ भी खेलने के लिए मिल सकता है । असल में, यह आपको एक मौजूदा वर्ग पर जैक्सन एनोटेशन को जोड़ने का एक तरीका देता है, वास्तव में उस वर्ग को संशोधित किए बिना। मैं एक लोमबोक समाधान के बजाय यहां इसकी सिफारिश करने की ओर झुकाव कर रहा हूं क्योंकि यह एक समस्या का हल करता है जैक्सन जैक्सन फीचर के साथ है, इसलिए यह लंबे समय तक काम करने की संभावना है।


1

मैंने अपनी सभी कक्षाओं को इस तरह एनोटेट किया है:

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@Data
@Accessors(fluent = true)
@NoArgsConstructor
@AllArgsConstructor

इसने कम से कम दो साल तक सभी लोम्बोक और जैक्सन संस्करणों के साथ काम किया।

उदाहरण:

@JsonAutoDetect(fieldVisibility = Visibility.ANY)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@Data
@Accessors(fluent = true)
@NoArgsConstructor
@AllArgsConstructor
public class Person {
    String id;
    String first;
    String last;
}

और बस। लोम्बोक और जैक्सन एक आकर्षण की तरह एक साथ खेलते हैं।


9
यह परस्पर श्रेणी है।
06कूसजग

0
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Person {
   String id;
   String first;
   String last;
}

डेटा वर्ग के लिए अतिरिक्त, यह सही ObjectMapper कॉन्फ़िगर किया जाना चाहिए। इस मामले में, यह एक ParameterNamesModule कॉन्फ़िगरेशन के साथ ठीक काम कर रहा है, और फ़ील्ड्स और क्रिएटर विधियों की दृश्यता सेट कर रहा है

    om.registerModule(new ParameterNamesModule());
    om.setVisibility(FIELD, JsonAutoDetect.Visibility.ANY);
    om.setVisibility(CREATOR, JsonAutoDetect.Visibility.ANY);

फिर उम्मीद के मुताबिक काम करना चाहिए।


0

मेरे पास लोम्बोक को ConstructorProperiesएनोटेशन नहीं जोड़ने के मुद्दे थे, इसलिए दूसरे तरीके से गए और जैक्सन को उस एनोटेशन को देखने से अक्षम कर दिया।

अपराधी जैक्सनएनोटेशनआईएन्ट्रोस्पेक्टर.फ्रेंड क्रिएटरअनोटेशन है । नोटिस:

if (_cfgConstructorPropertiesImpliesCreator
            && config.isEnabled(MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES)

इसके अलावा ध्यान दें जैक्सनएनोटेशनइंट्रोस्पेक्टर .सेटकोस्ट्रक्टरप्रोपरेटीइम्प्लीस क्रिएटर :

public JacksonAnnotationIntrospector setConstructorPropertiesImpliesCreator(boolean b)
{
    _cfgConstructorPropertiesImpliesCreator = b;
    return this;
}

तो आपके पास दो विकल्प हैं, या तो सेट MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIESगलत पर या एक बनाने के JacksonAnnotationIntrospectorसेट setConstructorPropertiesImpliesCreatorकरने के लिए falseऔर इस सेट AnnotationIntrospectorमें ObjectMapperके माध्यम से ObjectMapper.setAnnotationIntrospector

कुछ बातों पर ध्यान दें, मैं जैक्सन 2.8.10 का उपयोग कर रहा हूं और उस संस्करण में MapperFeature.INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIESमौजूद नहीं है। मुझे यकीन नहीं है कि जैक्सन के किस संस्करण में इसे जोड़ा गया था। इसलिए यदि यह नहीं है, तो JacksonAnnotationIntrospector.setConstructorPropertiesImpliesCreatorतंत्र का उपयोग करें ।


0

आप इस मॉड्यूल के रूप में अच्छी तरह से करने की आवश्यकता है। https://github.com/FasterXML/jackson-modules-java8

फिर अपने कंपाइलर के लिए -पैरामीटर ध्वज को चालू करें।

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>

0

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

JsonAutoDetect एनोटेशन जोड़ें और इसे संरक्षित / निजी सदस्यों का पता लगाने के लिए उचित रूप से सेट करें। यह डीटीओ के लिए सुविधाजनक है

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class SomeClass

@JsonCreator एनोटेशन के साथ एक फैक्ट्री फ़ंक्शन जोड़ें, यह सबसे अच्छा काम करता है अगर आपको कुछ ऑब्जेक्ट सत्यापन या अतिरिक्त ट्रांसफ़ॉर्म की आवश्यकता होती है।

public class SomeClass {

   // some code here

   @JsonCreator
   public static SomeClass factory(/* params here dressing them in @JsonProperty annotations*/) {
      return new SomeClass();
   }
}

बेशक, आप बस अपने आप में और साथ ही निर्माणकर्ता को मैन्युअल रूप से जोड़ सकते हैं।


-1

मेरे पास एक अलग मुद्दा था और यह बूलियन आदिम प्रकारों के साथ था।

private boolean isAggregate;

परिणामस्वरूप निम्न त्रुटि हो रही थी

Exception: Unrecognized field "isAggregate" (class 

लैम्बोक एक गेटर के रूप में परिवर्तित isAggregateहो isAggregate()जाता है, जो संपत्ति को आंतरिक रूप से aggregateइसके बजाय लुम्बोक में बनाता है isAggregate। जैक्सन लाइब्रेरी को यह पसंद नहीं है और उसे isAggregateइसके बदले संपत्ति चाहिए।

मैंने इस मुद्दे के चारों ओर काम करने के लिए प्राइमर बूलियन को रैपर बूलियन में अपडेट किया। आपके लिए अन्य विकल्प हैं यदि आप booleanप्रकारों के साथ काम कर रहे हैं , तो नीचे संदर्भ देखें।

सोल:

private Boolean isAggregate;

रेफरी: https://www.baeldung.com/lombok-getter-boolean


क्या आपने आदिम प्रकार के साथ isAregregate के बजाय कुल का उपयोग करने की कोशिश की? मुझे विश्वास है, यह त्रुटि को भी हल कर सकता है। भी यह देखने के लिए कृपया stackoverflow.com/a/42620096/6332074
मुहम्मद वकास दिलावर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.