java - formatter - json validator




JsonMappingException: কোন উপযুক্ত কন্সট্রকটার টাইপ[সাধারণ টাইপ, ক্লাস] জন্য পাওয়া যায়: JSON অবজেক্ট থেকে তাৎক্ষণিক করা যাবে না (8)

একটি JSON অনুরোধ পেতে এবং এটি প্রক্রিয়া করার সময় আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি:

org.codehaus.jackson.map.JsonMappingException: কোন উপযুক্ত কন্সট্রাকটর টাইপ [সাধারণ টাইপ, ক্লাস com.myweb.ApplesDO] জন্য পাওয়া যায়: JSON অবজেক্ট থেকে তাত্ক্ষণিক করতে পারবেন না (তথ্য যোগ করতে / সক্ষম করতে হবে?)

এখানে JSON আমি পাঠানোর চেষ্টা করছি:

{
  "applesDO" : [
    {
      "apple" : "Green Apple"
    },
    {
      "apple" : "Red Apple"
    }
  ]
}

নিয়ামক, আমার নিম্নলিখিত পদ্ধতি স্বাক্ষর আছে:

@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
    // Method Code
}

AllApplesDO ApplesDO এর একটি মোড়ক:

public class AllApplesDO {

    private List<ApplesDO> applesDO;

    public List<ApplesDO> getApplesDO() {
        return applesDO;
    }

    public void setApplesDO(List<ApplesDO> applesDO) {
        this.applesDO = applesDO;
    }
}

ApplesDO:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String appl) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom){
        //constructor Code
    }
}

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

সম্পাদনা করুন: উপরের সমস্যা নমুনা ক্লাসে এই সমস্যাটি ঘটাচ্ছে এমন প্রধান বাগ অন্তর্ভুক্ত করুন - দয়া করে সমাধানের জন্য গৃহীত উত্তরটি দেখুন।


আপনি এই গঠন পরীক্ষা করতে পারেন। যদি আমি সঠিক মনে করি তবে আপনি এটি ব্যবহার করতে পারেন:

{
    "applesRequest": {
        "applesDO": [
            {
                "apple": "Green Apple"
            },
            {
                "apple": "Red Apple"
            }
        ]
    }
}

দ্বিতীয়ত, দয়া করে প্রতিটি শ্রেণিতে ডিফল্ট কন্সট্রকটার যোগ করুন এটিও সাহায্য করতে পারে।


আপনি যদি কনস্ট্রাক্টর টীকাটি শুরু করতে চান, তবে আপনাকে অবশ্যই সমস্ত ক্ষেত্রের টীকা দিতে হবে।

লক্ষ্য করুন, আমার স্টাফ.নাম ক্ষেত্রটি JSON স্ট্রিংয়ে "ANOTHER_NAME" এ ম্যাপ করা হয়েছে।

     String jsonInString="{\"ANOTHER_NAME\":\"John\",\"age\":\"17\"}";
     ObjectMapper mapper = new ObjectMapper();
     Staff obj = mapper.readValue(jsonInString, Staff.class);
     // print to screen

     public static class Staff {
       public String name;
       public Integer age;
       public Staff() {         
       }        

       //@JsonCreator - don't need this
       public Staff(@JsonProperty("ANOTHER_NAME") String   n,@JsonProperty("age") Integer a) {
        name=n;age=a;
       }        
    }

আমার জন্য, এটি কাজ করে, কিন্তু লাইব্রেরি আপগ্রেড করার ফলে এই সমস্যাটি দেখা দেয়। সমস্যা এই ধরনের একটি ক্লাস ছিল:

package example.counter;

import javax.validation.constraints.NotNull;

import lombok.Data;

@Data
public class CounterRequest {
    @NotNull
    private final Integer int1;

    @NotNull
    private final Integer int2;
}

লম্বোক ব্যবহার করে:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
</dependency>

ফিরে আসছে

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
</dependency>

সমস্যা স্থির। নিশ্চিত না কেন, কিন্তু ভবিষ্যতের জন্য এটি নথিভুক্ত করতে চেয়েছিলেন।


আমি এমন আরেকটি সমাধান যুক্ত করতে চাই যা একটি ডামি কন্সট্রকটরের প্রয়োজন হয় না। যেহেতু ডামি কন্সট্রাক্টরগুলি একটি বিট নোংরা এবং পরবর্তীতে বিভ্রান্তিকর। আমরা একটি নিরাপদ কনস্ট্রাক্টর সরবরাহ করতে পারি এবং কন্সট্রাক্টর আর্গুমেন্টগুলি annotating করে আমরা জ্যাকসনকে কন্সট্রকটর প্যারামিটার এবং ক্ষেত্রের মধ্যে ম্যাপিং নির্ধারণ করার অনুমতি দিই।

তাই নিম্নলিখিত কাজ করবে। উল্লেখ্য টীকা ভিতরে স্ট্রিং ক্ষেত্রের নাম মেলে আবশ্যক।

import com.fasterxml.jackson.annotation.JsonProperty;
public class ApplesDO {

        private String apple;

        public String getApple() {
            return apple;
        }

        public void setApple(String apple) {
            this.apple = apple;
        }

        public ApplesDO(CustomType custom){
            //constructor Code
        }

        public ApplesDO(@JsonProperty("apple")String apple) {
        }

}

কাস্টম জ্যাকসন Serializers / Deserializers ব্যর্থ হচ্ছে সমস্যা হতে পারে। যদিও এটি আপনার ক্ষেত্রে না, এটি উল্লেখযোগ্য।

আমি একই ব্যতিক্রম সম্মুখীন এবং যে ক্ষেত্রে ছিল।


জ্যাকসন deserialization জন্য উপলব্ধ আছে কি অপশন বুঝতে হবে। জাভাতে, পদ্ধতির যুক্তি নাম কম্পাইল কোডে উপস্থিত হয় না। এই কারণে জ্যাকসন সর্বদা ইতিমধ্যে সেট করা সবকিছু দিয়ে একটি সংজ্ঞায়িত বস্তু তৈরি করতে কন্সট্রকটর ব্যবহার করতে পারবেন না।

সুতরাং, যদি একটি খালি কন্সট্রাকটর থাকে এবং সেটটার থাকে তবে এটি খালি কন্সট্রাকটর এবং সেট্টারগুলি ব্যবহার করে। কোন সেটার্স নেই, কিছু গাঢ় যাদু (প্রতিচ্ছবি) এটি করার জন্য ব্যবহার করা হয়।

যদি আপনি জ্যাকসনের সাথে একটি কনস্ট্রাক্টার ব্যবহার করতে চান, তবে আপনার উত্তরগুলিতে @ পিয়েরিপি দ্বারা উল্লেখিত এনটাইটেশনগুলি অবশ্যই ব্যবহার করতে হবে। আপনি একটি বিল্ডার প্যাটার্ন ব্যবহার করতে পারেন। আপনি কিছু ব্যতিক্রম, সৌভাগ্য সম্মুখীন হলে। জ্যাকসন-এ হ্যান্ডলিংয়ের সময় বড় সময় নষ্ট করে দেয়, এটি ত্রুটির বার্তাগুলিতে অলসতা বোঝা কঠিন।


সাধারণত এই ত্রুটিটি আসে কারণ আমরা ডিফল্ট কন্সট্রকটর তৈরি করি না কিন্তু আমার ক্ষেত্রেই সমস্যা আসছে কারণ আমি পিতামাতার ক্লাসের মধ্যে অবজেক্ট ক্লাস ব্যবহার করেছি। এই আমার পুরো দিন নষ্ট হয়েছে।


সুতরাং, অবশেষে আমি বুঝতে সমস্যা কি। আমি জ্যাকসন কনফিগারেশন ইস্যু হিসাবে এটি সন্দেহ করা হয় না।

প্রকৃতপক্ষে সমস্যা অ্যাপেলডো ক্লাসে ছিল:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }
}

ক্লাসের জন্য ডিফল্ট কন্সট্রাকটর তৈরি করার জন্য একটি কাস্টম কনস্ট্রাক্টর সংজ্ঞায়িত করা হয়েছিল। একটি ডামি কন্সট্রকটার উপস্থাপনের ত্রুটিটি দূর হয়ে গেছে:

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }

    //Introducing the dummy constructor
    public ApplesDO() {
    }

}




jackson