যখন কোনও কনস্ট্রাক্টরকে @ জসনক্রিটর দ্বারা টিকা দেওয়া হয়, তার যুক্তিগুলি অবশ্যই @ জসনপ্রোটির সাথে টীকায়িত করা উচিত?


107

জ্যাকসনে, আপনি যখন কোনও নির্মাণকারীর সাথে @JsonCreatorটিকা দেবেন, আপনাকে অবশ্যই এটির সাথে তার যুক্তিগুলি বর্নিত করতে হবে @JsonProperty। সুতরাং এই নির্মাতা

public Point(double x, double y) {
    this.x = x;
    this.y = y;
}

এটি হয়ে:

@JsonCreator
public Point(@JsonProperty("x") double x, @JsonProperty("y") double y) {
    this.x = x;
    this.y = y;
}

কেন এটি প্রয়োজনীয় তা আমি বুঝতে পারি না। আপনি দয়া করে ব্যাখ্যা করতে পারেন?

উত্তর:


112

জ্যাকসনকে জানতে হবে কোন জেএসওএন অবজেক্ট থেকে কনস্ট্রাক্টরের কাছে ক্ষেত্রগুলি কীভাবে পাস করতে হবে। প্রতিবিম্ব ব্যবহার করে জাভাতে প্যারামিটারের নামগুলি অ্যাক্সেস করা সম্ভব নয় - এজন্য আপনাকে টীকাতে এই তথ্যটি পুনরাবৃত্তি করতে হবে।


9
এটি জাভা 8
মরিউজসএস

12
@ মারিউজস এটি সত্য তবে জাভা 8 সংকলক পতাকা এবং একটি জ্যাকসন মডিউলটির সাহায্যে কীভাবে বহিরাগত টীকাগুলি থেকে মুক্তি পাবেন এই পোস্টটি ব্যাখ্যা করে। আমি পদ্ধতির পরীক্ষা করেছি এবং এটি কাজ করে।
কোয়ান্টাম

অবশ্যই, একটি মোহন এর
টিউটোরিয়াল

52

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

সুতরাং জ্যাকসন ব্যবহার করার সময় কনস্ট্রাক্টর আর্গুমেন্টগুলির জন্য টীকাগুলি ব্যবহার না করার জন্য, আপনি এই 2 টি জ্যাকসন মডিউল ব্যবহার করতে পারেন:

জ্যাকসন-মডিউল-প্যারামিটার-নাম

এই মডিউলটি জাভা 8 ব্যবহার করার সময় আপনাকে টিকা-মুক্ত কনস্ট্রাক্টর যুক্তি পেতে অনুমতি দেয় । এটি ব্যবহার করার জন্য আপনাকে প্রথমে মডিউলটি নিবন্ধভুক্ত করতে হবে:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule());

তারপরে -পরিমিতি পতাকা ব্যবহার করে আপনার কোডটি সংকলন করুন:

javac -parameters ...

লিঙ্ক: https://github.com/FasterXML/jackson-modules-java8/tree/master/parameter-names

জ্যাকসন-মডিউল-paranamer

এই অন্যটির জন্য আপনাকে কেবল মডিউলটি নিবন্ধভুক্ত করতে হবে বা একটি টীকাগুলি অন্তর্ভুক্তিটি কনফিগার করতে হবে (তবে উভয়ই মন্তব্য দ্বারা নির্দেশিত নয়)। এটি আপনাকে জাভা সংস্করণে 1.8 এর আগে টিকাদান মুক্ত কনস্ট্রাক্টর যুক্তি ব্যবহার করতে দেয় ।

ObjectMapper mapper = new ObjectMapper();
// either via module
mapper.registerModule(new ParanamerModule());
// or by directly assigning annotation introspector (but not both!)
mapper.setAnnotationIntrospector(new ParanamerOnJacksonAnnotationIntrospector());

লিঙ্ক: https://github.com/FasterXML/jackson-modules-base/tree/master/paranamer


28

Jdk8 দিয়ে কনস্ট্রাক্টর টীকাগুলি এড়ানো সম্ভব হয় যেখানে allyচ্ছিকভাবে সংকলক কনস্ট্রাক্টর প্যারামিটারের নামের সাথে মেটাডেটা প্রবর্তন করবে। তারপরে জ্যাকসন -মডিউল-পরামিতি-নামগুলির মডিউল সহ জ্যাকসন এই নির্মাতাটি ব্যবহার করতে পারেন। আপনি কোনও মন্তব্য ছাড়াই পোস্ট জ্যাকসনে একটি উদাহরণ দেখতে পাচ্ছেন



6

কারণ জাভা বাইটকোড পদ্ধতি বা নির্মাণকারী যুক্তির নাম ধরে রাখে না।


আর সত্য নয়: ডকস.অরাকল.com
জাভাস

1
@MariuszS প্রকৃতপক্ষে, কিন্তু যেহেতু এই হল একটি নতুন (এবং নন-ডিফল্ট কম্পাইলার পতাকা), জ্যাকসন তার সমর্থন করার জন্য অব্যাহত রাখার জন্য থাকবে @JsonPropertyটীকা
lcfd

6

কেউ সহজেই java.bean.ConstructorPererties টীকা ব্যবহার করতে পারেন - এটি অনেক কম ভার্বোস এবং জ্যাকসন এটিও গ্রহণ করে। উদাহরণ স্বরূপ :

  import java.beans.ConstructorProperties;

  @ConstructorProperties({"answer","closed","language","interface","operation"})
  public DialogueOutput(String answer, boolean closed, String language, String anInterface, String operation) {
    this.answer = answer;
    this.closed = closed;
    this.language = language;
    this.anInterface = anInterface;
    this.operation = operation;
  }

4

আমি যখন এটি সঠিকভাবে বুঝতে পারি , আপনি ডিফল্ট কনস্ট্রাক্টরটিকে একটি প্যারামিটারাইজড একের সাথে প্রতিস্থাপন করুন এবং সেইজন্য JSON কীগুলি বর্ণনা করতে হবে যা কনস্ট্রাক্টরকে কল করতে ব্যবহৃত হয়।


3

টীকাগুলির ডকুমেন্টেশনে যেমন সংজ্ঞায়িত করা হয়েছে , টীকাটি নির্দেশ করে যে আর্গুমেন্টের নামটি কোনও পরিবর্তন ছাড়াই সম্পত্তির নাম হিসাবে ব্যবহৃত হয়, তবে এটি আলাদা নাম উল্লেখ করার জন্য খালি-খালি মানকে নির্দিষ্ট করা যেতে পারে:


0

শুধু এটি জুড়ে এসে কোথাও একটি উত্তর পেয়েছি। আপনি 2.7.0 থেকে নীচে টিকাটি ব্যবহার করতে পারেন

@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public class Point {
    final private double x;
    final private double y;

    @ConstructorProperties({"x", "y"})
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.