জ্যাকসন: ফিল্ড সিরিয়ালাইজেশন কীভাবে প্রতিরোধ করবেন


163

আমার একটি পাসওয়ার্ড ক্ষেত্র সহ একটি সত্তা শ্রেণি রয়েছে:

class User {
    private String password;

    //setter, getter..
}

সিরিয়ালাইজেশনের সময় আমি এই ক্ষেত্রটি এড়িয়ে যেতে চাই। তবে এটি এখনও নির্মূলকরণে সক্ষম হওয়া উচিত। এটি প্রয়োজন, যাতে ক্লায়েন্ট আমাকে একটি নতুন পাসওয়ার্ড প্রেরণ করতে পারে তবে বর্তমানেরটি পড়তে সক্ষম হয় না।

আমি জ্যাকসনের সাথে এটি কীভাবে সম্পাদন করব?


1
আপনি এটিকে সিরিয়ালাইজ করতে চান না, তবে আপনি এটির ডিসরিয়ালাইজ করতে সক্ষম হতে চান? এটা অসম্ভব, আমি বলব। আপনি যদি কোনও বাক্সে কুকি না রাখেন তবে আপনি এই বাক্সটি থেকে এটি পুনরুদ্ধার করতে পারবেন না।
অ্যালেক্সিস ডুফরনয়

1
@ ট্র্যারোথ: তবে আমি একটি নতুন কুকি রাখতে পারি। আমি কেবল একটি সুবিধাজনক টীকা অনুসন্ধান করছি, তবে এটি অবশ্যই হাত দ্বারা করা যেতে পারে।
সপ্তাহের

8
তাত্ক্ষণিক মন্তব্য: টেকনিক্যালি, একটি সেটার ব্যবহার করা সম্পূর্ণভাবে সম্ভব (এমনকি ব্যক্তিগত এমনকি স্বতঃ-সনাক্ত করা হয়), এবং কেবল অ্যাক্সেসর বাদ দিন (কোনও পাবলিক ফিল্ড বা গেটর নেই)। @JsonIgnoreগিটারে যোগ করাও সম্ভব , তবে @JsonPropertyসেটারে, কোনও ক্ষেত্রে জিনিসগুলি সিরিয়ালাইজড করা হয় না, তবে এটি ডিসেরায়ালাইজড করা যায়।
স্ট্যাকসমান

4
আপনি কি এই প্রশ্নের উত্তর গ্রহণ করতে আপত্তি করবেন? (আপনার অন্য কয়েকজনের কয়েক বছর বয়সী এবং এখনও অগ্রহণযোগ্য ... দয়া করে পর্যালোচনা বিবেচনা করুন!) :) সম্পূর্ণ প্রকাশ - এই প্রশ্নের কোনও উত্তর আমার কাছে নেই।
বেরেট

উত্তর:


187

আপনি এটি হিসাবে চিহ্নিত করতে পারেন @JsonIgnore

1.9 সঙ্গে, আপনি যোগ করতে পারেন @JsonIgnore, সংগ্রহকারী জন্য @JsonPropertyসেটার জন্য, এটি deserialize কিন্তু ধারাবাহিকভাবে না করা।


6
@ জসনআইগনোর পাশাপাশি deserialization প্রতিরোধ করে। ক্ষণস্থায়ী জন্য - আমি এটি পরীক্ষা করে দেখুন।
সপ্তাহের

98
1.9 সঙ্গে, আপনি যোগ করতে পারেন @JsonIgnore, সংগ্রহকারী জন্য @JsonPropertyসেটার জন্য, এটি deserialize কিন্তু ধারাবাহিকভাবে না করা।
StaxMan

স্ট্যাক্সম্যানের মন্তব্যের উত্তর হওয়া উচিত, তাই না? তারপরেও কেন এখনও এই মন্তব্য ...! ..?
সারওয়ানবালাগী রামচন্দ্রন

ক্ষণস্থায়ী আমার পক্ষে কাজ করে না বলে মনে হয়, আমি ক্ষেত্রটিকে "ক্ষণস্থায়ী" চিহ্নিত করেছিলাম যা আমি চাই না যে এটি সেরিলাইজড / ডিসিরিয়ালাইজড করা হোক।
রোহিথ

এই উত্তরটি আগে ব্যবহার করার পরামর্শ দিয়েছিল transient(যেমন হিসাবে private transient String password;) তবে পাবলিক গেটার সহ ক্ষণস্থায়ী ক্ষেত্রগুলি উপেক্ষা করা হবে যদি না ম্যাপারফিউচার .PROPAGATE_TRANSIENT_MARKER সক্ষম না হয়।
টম

96

স্ট্যাক্সমান কী বলেছে তা চিত্রিত করে, এটি আমার পক্ষে কাজ করে

private String password;

@JsonIgnore
public String getPassword() {
    return password;
}

@JsonProperty
public void setPassword(String password) {
    this.password = password;
}

12
আপনি কোন জসন নির্ভরতা ব্যবহার করেন? এটি com.fasterxML.jackson এর সাথে কাজ করে না
আলেকজান্ডার বুড়াক্যাভিচ

3
ধন্যবাদ! @JsonIgnoreমাঠে এটি প্রয়োজনীয় নয়, মনে হয়।
ফেরান মেলিনচ

com.fasterxML.jackson.annotation.Json জ্যাকসন-টীকাগুলি থেকে উপেক্ষা করুন - <
রূপান্তর

আমি এটি চেষ্টা করেছি এবং এটি আমার পক্ষে কাজ করছে না। আমি v2.8 ব্যবহার করি। কোন সাহায্য?
মাজ

36

সহজ উপায় হ'ল আপনার গেটার এবং সেটারগুলি টীকা দেওয়া।

এখানে সরল পাঠ্য পাসওয়ার্ড বাদ দেওয়ার জন্য পরিবর্তিত মূল উদাহরণটি দেওয়া হয়েছে, তবে তারপরে একটি নতুন পদ্ধতিটি টিকিয়ে দিন যা কেবল পাসওয়ার্ড ক্ষেত্রকে এনক্রিপ্ট করা পাঠ্য হিসাবে ফেরত দেয়।

class User {

    private String password;

    public void setPassword(String password) {
        this.password = password;
    }

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty("password")
    public String getEncryptedPassword() {
        // encryption logic
    }
}

21

জ্যাকসন ২.6 দিয়ে শুরু করে , কোনও সম্পত্তি কেবল পঠনযোগ্য বা লেখার জন্য চিহ্নিত করা যেতে পারে। উভয় অ্যাক্সেসরগুলিতে টীকাগুলি হ্যাক করার চেয়ে সহজ এবং সমস্ত তথ্য এক জায়গায় রাখে:

public class User {
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
}

এটি একটি দুর্দান্ত সমাধান, সহজ, কাজ করা। ধন্যবাদ।
dhqvinh

17

বাদে @JsonIgnore, আরও কয়েকটি সম্ভাবনা রয়েছে:

  • ব্যবহারের তাদেরকে JSON প্রতি শর্তসাপেক্ষে বাইরে ক্ষেত্র ফিল্টার (ডিফল্ট, deserialization জন্য ব্যবহার করা করে; মধ্যে 2.0 উপলব্ধ করা হবে কিন্তু আপনি ধারাবাহিকতাতে বিভিন্ন দৃশ্য ব্যবহার করতে পারেন, deserialization)
  • @JsonIgnoreProperties ক্লাসে দরকারী হতে পারে

10

transientআমার জন্য সমাধান। ধন্যবাদ! এটি জাভাতে নেটিভ এবং আপনাকে অন্য ফ্রেমওয়ার্ক-নির্দিষ্ট টীকা যুক্ত করতে এড়িয়ে চলে।


2
এটি কাজ করে যদি আপনার বৈশিষ্ট্যটি সত্যিই ক্ষণস্থায়ী হয়, তবে ওআরএম জড়িত না, উদাহরণস্বরূপ .... পাওয়া গেছে @ জসন আমার ক্ষেত্রে আরও আকর্ষণীয় হওয়ার বিষয়টি উপেক্ষা করুন, যদিও আমি জ্যাকসনের কাছে লক হয়ে গিয়েছিলাম, তবে এটি একটি ভাল বাণিজ্য
জোওও পেরেইরা

3
আপনি যদি নিজের টিকাটি তৈরি করেন এবং এটি জসনআইগনোর এবং জ্যাকসনঅনোটেশনস ইনসাইড দ্বারা টীকাযুক্ত করা হয় তবে আপনাকে জ্যাকসনে লক করতে হবে না। এইভাবে, আপনি যদি সিরিয়ালাইজারগুলি পরিবর্তন করেন তবে আপনাকে কেবল নিজের টীকা পরিবর্তন করতে হবে।
ডেভিডএ

4

আপনার পাসওয়ার্ডের জন্য কেন পাবলিক গেটর পদ্ধতি চাইবেন তা জিজ্ঞাসা করা উচিত। হাইবারনেট বা অন্য কোনও ওআরএম কাঠামো একটি ব্যক্তিগত গেটর পদ্ধতিতে করবে with পাসওয়ার্ডটি সঠিক কিনা তা পরীক্ষা করার জন্য, আপনি ব্যবহার করতে পারেন

public boolean checkPassword(String password){
  return this.password.equals(anyHashingMethod(password));
}

আমি আসলে মনে করি এটি সমাধান সম্পর্কে চিন্তা করার সেরা উপায়। আপনার প্রয়োজনীয় জিনিসগুলি ব্যক্তিগতভাবে তৈরি করা এবং অবজেক্ট থেকে নিজেই এগুলি নিয়ন্ত্রণ করা আরও বেশি অর্থবোধ করে।
আরসিএনাম

2

জ্যাকসনের সিম্পলবিয়ানপ্রপার্টিফিল্টার নামে একটি শ্রেণি রয়েছে যা সিরিয়ালাইজেশন এবং ডিসরিয়ালেসনের সময় ক্ষেত্রগুলি ফিল্টার করতে সহায়তা করে; বিশ্বব্যাপী নয় আমি মনে করি আপনি এটি চেয়েছিলেন কি।

@JsonFilter("custom_serializer")
class User {
    private String password;

    //setter, getter..
}

তারপরে আপনার কোডে:

String[] fieldsToSkip = new String[] { "password" };

ObjectMapper mapper = new ObjectMapper();

final SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter("custom_serializer",
            SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));

mapper.setFilters(filter);

String jsonStr = mapper.writeValueAsString(currentUser);

এটি passwordক্ষেত্রটি সিরিয়ালায়িত হতে বাধা দেবে । এছাড়াও আপনি passwordক্ষেত্রগুলি যেমন হয় তেমনই deserialize করতে সক্ষম হবেন । অবজেক্টম্যাপার অবজেক্টে কোনও ফিল্টার প্রয়োগ করা হয়নি তা নিশ্চিত করুন।

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(yourJsonStr, User.class);    // user object does have non-null password field

0

হিসাবে পরিবর্তনশীল সেট

@JsonIgnore

এটি ভেরিয়েবলকে জসন সিরিয়ালাইজার এড়িয়ে যেতে দেয়

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