স্প্রিং এমভিসি থেকে জেএসএন হিসাবে প্রেরণ করার সময় জাভা অবজেক্ট থেকে ক্ষেত্রগুলি গতিশীলভাবে উপেক্ষা করুন


107

হাইবারনেটের জন্য আমার মতো মডেল ক্লাস রয়েছে

@Entity
@Table(name = "user", catalog = "userdb")
@JsonIgnoreProperties(ignoreUnknown = true)
public class User implements java.io.Serializable {

    private Integer userId;
    private String userName;
    private String emailId;
    private String encryptedPwd;
    private String createdBy;
    private String updatedBy;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "UserId", unique = true, nullable = false)
    public Integer getUserId() {
        return this.userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    @Column(name = "UserName", length = 100)
    public String getUserName() {
        return this.userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Column(name = "EmailId", nullable = false, length = 45)
    public String getEmailId() {
        return this.emailId;
    }

    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }

    @Column(name = "EncryptedPwd", length = 100)
    public String getEncryptedPwd() {
        return this.encryptedPwd;
    }

    public void setEncryptedPwd(String encryptedPwd) {
        this.encryptedPwd = encryptedPwd;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    @Column(name = "UpdatedBy", length = 100)
    public String getUpdatedBy() {
        return this.updatedBy;
    }

    public void setUpdatedBy(String updatedBy) {
        this.updatedBy = updatedBy;
    }
}

স্প্রিং এমভিসি কন্ট্রোলারে, ডিএও ব্যবহার করে, আমি বস্তুটি পেতে সক্ষম হয়েছি। এবং JSON অবজেক্ট হিসাবে ফিরে আসছেন।

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/getUser/{userId}", method = RequestMethod.GET)
    @ResponseBody
    public User getUser(@PathVariable Integer userId) throws Exception {

        User user = userService.get(userId);
        user.setCreatedBy(null);
        user.setUpdatedBy(null);
        return user;
    }
}

অ্যাংুলারজেএস ব্যবহার করে দেখুন অংশটি সম্পন্ন করা হয়েছে, সুতরাং এটি জেএসওএনটিকে এটির মতো পাবে

{
  "userId" :2,
  "userName" : "john",
  "emailId" : "john@gmail.com",
  "encryptedPwd" : "Co7Fwd1fXYk=",
  "createdBy" : null,
  "updatedBy" : null
}

যদি আমি এনক্রিপ্ট করা পাসওয়ার্ড সেট করতে না চাই, তবে আমি সেই ক্ষেত্রটি শূন্য হিসাবে সেট করব।

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

{
  "userId" :2,
  "userName" : "john",
  "emailId" : "john@gmail.com"
}

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

আমি আশা করি আপনি আমার প্রশ্ন পেয়েছেন।


এই উত্তর সম্পর্কে আপনি কি বলবেন? stackoverflow.com/a/30559076/3488143
Iryna

এই তথ্যটি সহায়ক হতে পারে স্ট্যাকওভারফ্লো.com
মুসা

উত্তর:


149

@JsonIgnoreProperties("fieldname")আপনার পজোতে টীকা যুক্ত করুন ।

অথবা আপনি @JsonIgnoreজেএসএনকে ডিসিজায়াল করার সময় যে ক্ষেত্রটি উপেক্ষা করতে চান তার নাম ব্যবহার করার আগে আপনি ব্যবহার করতে পারেন । উদাহরণ:

@JsonIgnore
@JsonProperty(value = "user_password")
public String getUserPassword() {
    return userPassword;
}

গিটহাবের উদাহরণ


66
আমি কি এটি গতিশীলভাবে করতে পারি? POJO এ নেই? আমি কি আমার নিয়ামক শ্রেণিতে এটি করতে পারি?
আইকোড

4
@iProgrammer: এখানে আপনি একটি অনুরূপ চাই: stackoverflow.com/questions/8179986/...
user3145373ツ

4
@iProgrammer: খুব চিত্তাকর্ষক উত্তর এখানে stackoverflow.com/questions/13764280/...
user3145373ツ

12
মন্তব্য: @JsonIgnoreহয় com.fasterxml.jackson.annotation.JsonIgnoreনা org.codehaus.jackson.annotate.JsonIgnore
xiaohuo

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

33

আমি জানি আমি পার্টিতে কিছুটা দেরি করেছি, তবে কয়েক মাস আগে আমি আসলে এটিতে দৌড়ে এসেছি। সমস্ত উপলভ্য সমাধান আমার কাছে খুব আবেদনকারী ছিল না (মিশ্রিনস? উ!), সুতরাং আমি এই প্রক্রিয়াটিকে আরও পরিষ্কার করার জন্য একটি নতুন লাইব্রেরি তৈরির কাজ শেষ করেছি। যদি কেউ এটি চেষ্টা করে দেখতে চান তবে এটি এখানে উপলভ্য: https://github.com/monitorjbl/spring-json-view

মৌলিক ব্যবহারটি বেশ সহজ, আপনি JsonViewনিজের নিয়ন্ত্রক পদ্ধতিতে এই জাতীয় জিনিসটি ব্যবহার করেন :

import com.monitorjbl.json.JsonView;
import static com.monitorjbl.json.Match.match;

@RequestMapping(method = RequestMethod.GET, value = "/myObject")
@ResponseBody
public void getMyObjects() {
    //get a list of the objects
    List<MyObject> list = myObjectService.list();

    //exclude expensive field
    JsonView.with(list).onClass(MyObject.class, match().exclude("contains"));
}

আপনি এটি বসন্তের বাইরেও ব্যবহার করতে পারেন:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import static com.monitorjbl.json.Match.match;

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(JsonView.class, new JsonViewSerializer());
mapper.registerModule(module);

mapper.writeValueAsString(JsonView.with(list)
      .onClass(MyObject.class, match()
        .exclude("contains"))
      .onClass(MySmallObject.class, match()
        .exclude("id"));

5
ধন্যবাদ! এটি আমার জন্য যাওয়ার উপায় ছিল। আমার বিভিন্ন স্থানে একই জিনিসগুলির সাথে কাস্টম জেএসএন ভিউ দরকার ছিল এবং @ জসনআইগনোর ঠিক কাজ করবে না। এই গ্রন্থাগারটি এটিকে মৃত সহজ করে তুলেছে।
জেফ

4
আপনি আমার কোড ক্লিনার এবং বাস্তবায়ন আরও সহজ করেছেন। ধন্যবাদ
আনিন্ডিস

@ মোনিটরজবিএল: এটি কিছুটা দূরে, আমি জেসন ভিউ এবং এটি আমার উদ্দেশ্য সমাধানের জন্য ব্যবহার করেছি। তবে আমি java.util.Date ক্লাসের জন্য কাস্টম সিরিয়ালাইজারটি নিবন্ধন করতে পারছি না (কোনও রানটাইম / কম্পাইল সময় ত্রুটি নেই) আমি কাস্টম সিরিয়ালাইজারটি রেজিস্টার করতে সক্ষম হয়েছি string
নিনাদ

জসনভিউ এখন জ্যাকসন অবজেক্ট ম্যাপারের অংশ বলে মনে হচ্ছে
ম্যাক্সেহ

21

আমি কি এটি গতিশীলভাবে করতে পারি?

দর্শন শ্রেণি তৈরি করুন:

public class View {
    static class Public { }
    static class ExtendedPublic extends Public { }
    static class Internal extends ExtendedPublic { }
}

আপনি মডেল টিকা

@Document
public class User {

    @Id
    @JsonView(View.Public.class)
    private String id;

    @JsonView(View.Internal.class)
    private String email;

    @JsonView(View.Public.class)
    private String name;

    @JsonView(View.Public.class)
    private Instant createdAt = Instant.now();
    // getters/setters
}

আপনার নিয়ামকটিতে ভিউ ক্লাস নির্দিষ্ট করুন

@RequestMapping("/user/{email}")
public class UserController {

    private final UserRepository userRepository;

    @Autowired
    UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @RequestMapping(method = RequestMethod.GET)
    @JsonView(View.Internal.class)
    public @ResponseBody Optional<User> get(@PathVariable String email) {
        return userRepository.findByEmail(email);
    }

}

ডেটা উদাহরণ:

{"id":"5aa2496df863482dc4da2067","name":"test","createdAt":"2018-03-10T09:35:31.050353800Z"}

4
এটি একটি চমত্কার এবং সংক্ষিপ্ত উত্তর! আমি একটি @ কনফিগারেশন টীকাযুক্ত উপাদান থেকে মাত্র কয়েকটি ক্ষেত্রের JSON হিসাবে ফিরে আসতে চেয়েছিলাম এবং স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত সমস্ত অভ্যন্তরীণ ক্ষেত্রগুলি এড়িয়ে চলেছি। অনেক ধন্যবাদ!
stx

15

আমরা JsonProperty.Access.WRITE_ONLYসম্পত্তি ঘোষণার সময় অ্যাক্সেস সেট করে এটি করতে পারি ।

@JsonProperty( value = "password", access = JsonProperty.Access.WRITE_ONLY)
@SerializedName("password")
private String password;

14

হ্যাঁ, আপনি কোন ক্ষেত্রগুলি JSON প্রতিক্রিয়া হিসাবে সিরিয়ালযুক্ত এবং কোনটি উপেক্ষা করবেন তা নির্দিষ্ট করতে পারেন। গতিশীলভাবে বৈশিষ্ট্য উপেক্ষা করার জন্য আপনার এটি করা দরকার।

1) প্রথমত, আপনাকে আপনার সত্তা শ্রেণিতে com.fasterxml.jackson.annotation.JsonFilter থেকে @ JsonFilter যুক্ত করতে হবে।

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("SomeBeanFilter")
public class SomeBean {

  private String field1;

  private String field2;

  private String field3;

  // getters/setters
}

2) তারপরে আপনার নিয়ামকটিতে আপনাকে ম্যাপিংজ্যাকসনভ্যালু অবজেক্ট তৈরি করতে হবে এবং এতে ফিল্টার সেট করতে হবে এবং শেষ পর্যন্ত আপনাকে এই অবজেক্টটি ফিরিয়ে দিতে হবে।

import java.util.Arrays;
import java.util.List;

import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;

@RestController
public class FilteringController {

  // Here i want to ignore all properties except field1,field2.
  @GetMapping("/ignoreProperties")
  public MappingJacksonValue retrieveSomeBean() {
    SomeBean someBean = new SomeBean("value1", "value2", "value3");

    SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("field1", "field2");

    FilterProvider filters = new SimpleFilterProvider().addFilter("SomeBeanFilter", filter);

    MappingJacksonValue mapping = new MappingJacksonValue(someBean);

    mapping.setFilters(filters);

    return mapping;
  }
}

প্রতিক্রিয়াতে আপনি এটি পাবেন:

{
  field1:"value1",
  field2:"value2"
}

এর পরিবর্তে:

{
  field1:"value1",
  field2:"value2",
  field3:"value3"
}

এখানে আপনি দেখতে পারেন সম্পত্তি ক্ষেত্র 1 এবং ফিল্ড 2 বাদে প্রতিক্রিয়া হিসাবে এটি অন্যান্য বৈশিষ্ট্যগুলি (এই ক্ষেত্রে ফিল্ড 3) উপেক্ষা করে।

আশাকরি এটা সাহায্য করবে.


4
@ শাফকাত ম্যান, আপনাকে অনেক ধন্যবাদ, আপনি আমার উদ্ধারকর্তা। এই জাতীয় কার্যকারিতাটি খোঁজার চেষ্টা করে প্রায় এক দিন অতিবাহিত করেছেন। এই সমাধান এত মার্জিত এবং সহজ? এবং অনুরোধ করা হয়েছে ঠিক কি করে। সঠিক উত্তর হিসাবে চিহ্নিত করা উচিত।
ওলেগ কিটস

12

@JsonInclude(JsonInclude.Include.NON_NULL)ক্লাসে @JsonIgnoreএবং পাসওয়ার্ড ক্ষেত্রে যোগ করুন (জ্যাকসনকে নাল মানকে সিরিয়াল করতে বাধ্য করুন ) ।

আপনি অবশ্যই @JsonIgnoreস্রষ্টিবায় এবং আপডেটডাইয়ের মাধ্যমে সেট করতে পারেন, যদি আপনি কেবল তখনই সুনির্দিষ্ট হন না তবে কেবল অবহেলা করতে চান।

হালনাগাদ

আপনি নিজে পজোতে টীকা যুক্ত করতে চান না এমন ইভেন্টে, দুর্দান্ত বিকল্প হ'ল জ্যাকসনের মিক্সিন টিকা। পরীক্ষা করে দেখুন ডকুমেন্টেশন


আমি কি এটি গতিশীলভাবে করতে পারি? POJO এ নেই? আমি কি আমার নিয়ামক শ্রেণিতে এটি করতে পারি?
আইকোড

আপনি কি পজোতে টীকা যুক্ত করতে চান না তার অর্থ?
জিওএন্ড

কারণ মাঝে মাঝে আমি সমস্ত ক্ষেত্র ক্লায়েন্টের পাশে প্রেরণ করতে চাই। কখনও কখনও কয়েকটি ক্ষেত্র। ক্লায়েন্টের কাছে আমার যে ক্ষেত্রগুলি প্রেরণ করা উচিত তা কেবলমাত্র নিয়ামক শ্রেণিতে ডাটাবেস থেকে পাচ্ছে। এর পরে কেবলমাত্র আমাকে ঠিক করতে হবে কোন ক্ষেত্রগুলিকে উপেক্ষা করা উচিত।
আইকোড

6

আমি যদি আপনি হয়ে থাকি এবং এটি করতে চাইতাম তবে আমি কন্ট্রোলার স্তরে আমার ব্যবহারকারীর সত্তাটি ব্যবহার করতাম না ns প্রতিষ্ঠিত হয়ে আমি ব্যবসায়ের (পরিষেবা) স্তর এবং নিয়ন্ত্রকের সাথে যোগাযোগের জন্য ব্যবহারকারীর (ডেটা ট্রান্সফার অবজেক্ট) তৈরি এবং ব্যবহার করি। আপনি ব্যবহারকারীর সত্তা থেকে ইউজারড্টোতে ডেটা অনুলিপি করতে অ্যাপাচি বিনআল্টিলস (কপিরপোপার্টি পদ্ধতি) ব্যবহার করতে পারেন।


3

আমি একটি জসন ইউটিল তৈরি করেছি যা প্রতিক্রিয়া দেওয়ার সময় রানটাইমে ক্ষেত্রগুলি উপেক্ষা করার জন্য ব্যবহার করা যেতে পারে।

উদাহরণস্বরূপ ব্যবহার: প্রথম যুক্তিটি কোনও POJO শ্রেণি (ছাত্র) হওয়া উচিত এবং উপেক্ষা করা ফিল্ডস হ'ল কমা বিচ্ছিন্ন ক্ষেত্রগুলি যা আপনি প্রতিক্রিয়াতে উপেক্ষা করতে চান।

 Student st = new Student();
 createJsonIgnoreFields(st,"firstname,age");

import java.util.logging.Logger;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;

public class JsonUtil {

  public static String createJsonIgnoreFields(Object object, String ignoreFields) {
     try {
         ObjectMapper mapper = new ObjectMapper();
         mapper.getSerializationConfig().addMixInAnnotations(Object.class, JsonPropertyFilterMixIn.class);
         String[] ignoreFieldsArray = ignoreFields.split(",");
         FilterProvider filters = new SimpleFilterProvider()
             .addFilter("filter properties by field names",
                 SimpleBeanPropertyFilter.serializeAllExcept(ignoreFieldsArray));
         ObjectWriter writer = mapper.writer().withFilters(filters);
         return writer.writeValueAsString(object);
     } catch (Exception e) {
         //handle exception here
     }
     return "";
   }

   public static String createJson(Object object) {
        try {
         ObjectMapper mapper = new ObjectMapper();
         ObjectWriter writer = mapper.writer().withDefaultPrettyPrinter();
         return writer.writeValueAsString(object);
        }catch (Exception e) {
         //handle exception here
        }
        return "";
   }
 }    

3

আমি কেবল @JsonIgnoreক্রাইকারের পরামর্শ মতো ব্যবহার করে সমাধান করেছি । সুতরাং আপনার গ্রাহক হয়ে উঠবে:

@JsonIgnore
public String getEncryptedPwd() {
    return this.encryptedPwd;
}

আপনি এখানে@JsonIgnore বর্ণিত মত ফিল্ড, সেটার বা গিটারে অবশ্যই সেট করতে পারেন ।

এবং, যদি আপনি কেবল সিরিয়ালাইজেশনের পক্ষ থেকে এনক্রিপ্ট করা পাসওয়ার্ডকে সুরক্ষিত করতে চান (যেমন আপনার ব্যবহারকারীদের যখন লগইন করতে হবে তখন), @JsonPropertyআপনার ক্ষেত্রে এই টিকাটি যুক্ত করুন :

@JsonProperty(access = Access.WRITE_ONLY)
private String encryptedPwd;

আরও তথ্য এখানে


1

আমি স্প্রিং এবং জ্যাকসন দিয়ে আমার জন্য একটি সমাধান পেয়েছি

প্রথমে সত্তায় ফিল্টার নাম উল্লেখ করুন

@Entity
@Table(name = "SECTEUR")
@JsonFilter(ModelJsonFilters.SECTEUR_FILTER)
public class Secteur implements Serializable {

/** Serial UID */
private static final long serialVersionUID = 5697181222899184767L;

/**
 * Unique ID
 */
@Id
@JsonView(View.SecteurWithoutChildrens.class)
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@JsonView(View.SecteurWithoutChildrens.class)
@Column(name = "code", nullable = false, length = 35)
private String code;

/**
 * Identifiant du secteur parent
 */
@JsonView(View.SecteurWithoutChildrens.class)
@Column(name = "id_parent")
private Long idParent;

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "id_parent")
private List<Secteur> secteursEnfants = new ArrayList<>(0);

}

তারপরে আপনি বসন্ত কনফিগারেশনে ব্যবহৃত ডিফল্ট ফিল্টারপ্রোভাইডার সহ ধ্রুবক ফিল্টারগুলির নাম শ্রেণি দেখতে পারেন

public class ModelJsonFilters {

public final static String SECTEUR_FILTER = "SecteurFilter";
public final static String APPLICATION_FILTER = "ApplicationFilter";
public final static String SERVICE_FILTER = "ServiceFilter";
public final static String UTILISATEUR_FILTER = "UtilisateurFilter";

public static SimpleFilterProvider getDefaultFilters() {
    SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAll();
    return new SimpleFilterProvider().setDefaultFilter(theFilter);
}

}

বসন্ত কনফিগারেশন:

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "fr.sodebo")

public class ApiRootConfiguration extends WebMvcConfigurerAdapter {

@Autowired
private EntityManagerFactory entityManagerFactory;


/**
 * config qui permet d'éviter les "Lazy loading Error" au moment de la
 * conversion json par jackson pour les retours des services REST<br>
 * on permet à jackson d'acceder à sessionFactory pour charger ce dont il a
 * besoin
 */
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    super.configureMessageConverters(converters);
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();

    // config d'hibernate pour la conversion json
    mapper.registerModule(getConfiguredHibernateModule());//

    // inscrit les filtres json
    subscribeFiltersInMapper(mapper);

    // config du comportement de json views
    mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

    converter.setObjectMapper(mapper);
    converters.add(converter);
}

/**
 * config d'hibernate pour la conversion json
 * 
 * @return Hibernate5Module
 */
private Hibernate5Module getConfiguredHibernateModule() {
    SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
    Hibernate5Module module = new Hibernate5Module(sessionFactory);
    module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, true);

    return module;

}

/**
 * inscrit les filtres json
 * 
 * @param mapper
 */
private void subscribeFiltersInMapper(ObjectMapper mapper) {

    mapper.setFilterProvider(ModelJsonFilters.getDefaultFilters());

}

}

আমার যখন প্রয়োজন হবে অবশেষে আমি রেস্টকন্টোল্লারে একটি নির্দিষ্ট ফিল্টার নির্দিষ্ট করতে পারি ....

@RequestMapping(value = "/{id}/droits/", method = RequestMethod.GET)
public MappingJacksonValue getListDroits(@PathVariable long id) {

    LOGGER.debug("Get all droits of user with id {}", id);

    List<Droit> droits = utilisateurService.findDroitsDeUtilisateur(id);

    MappingJacksonValue value;

    UtilisateurWithSecteurs utilisateurWithSecteurs = droitsUtilisateur.fillLists(droits).get(id);

    value = new MappingJacksonValue(utilisateurWithSecteurs);

    FilterProvider filters = ModelJsonFilters.getDefaultFilters().addFilter(ModelJsonFilters.SECTEUR_FILTER, SimpleBeanPropertyFilter.serializeAllExcept("secteursEnfants")).addFilter(ModelJsonFilters.APPLICATION_FILTER,
            SimpleBeanPropertyFilter.serializeAllExcept("services"));

    value.setFilters(filters);
    return value;

}

5
কেন একটি সহজ প্রশ্নের জন্য এত জটিলতা
হুমায়ুন আহমেদ

1

স্থান @JsonIgnoreক্ষেত্রের উপর বা তার সংগ্রহকারী, অথবা একটি কাস্টম DTO তৈরি

@JsonIgnore
private String encryptedPwd;

অথবা দ্বারা উপরে উল্লিখিত ceekayসঙ্গে টিকা রচনা করা @JsonPropertyযেখানে এক্সেস অ্যাট্রিবিউট সেট করা হয় শুধুমাত্র লিখতে

@JsonProperty( value = "password", access = JsonProperty.Access.WRITE_ONLY)
private String encryptedPwd;

0

একটি তৈরি করা হবে না UserJsonResponse শ্রেণি এবং কাঙ্ক্ষিত ক্ষেত্রগুলি দিয়ে পপুলেশন করা ক্লিনার সলিউশন হতে পারে না?

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

ভবিষ্যতে, উদাহরণস্বরূপ আপনার জেএসওএন ক্ষেত্র থাকতে পারে যা কোনও মডেল ফিল্ডের সাথে মেলে না এবং তারপরে আপনি আরও বড় সমস্যায় পড়তে পারেন।


0

উপরের উত্তরের জন্য এটি একটি পরিষ্কার ইউটিলিটি সরঞ্জাম :

@GetMapping(value = "/my-url")
public @ResponseBody
MappingJacksonValue getMyBean() {
    List<MyBean> myBeans = Service.findAll();
    MappingJacksonValue mappingValue = MappingFilterUtils.applyFilter(myBeans, MappingFilterUtils.JsonFilterMode.EXCLUDE_FIELD_MODE, "MyFilterName", "myBiggerObject.mySmallerObject.mySmallestObject");
    return mappingValue;
}

//AND THE UTILITY CLASS
public class MappingFilterUtils {

    public enum JsonFilterMode {
        INCLUDE_FIELD_MODE, EXCLUDE_FIELD_MODE
    }
    public static MappingJacksonValue applyFilter(Object object, final JsonFilterMode mode, final String filterName, final String... fields) {
        if (fields == null || fields.length == 0) {
            throw new IllegalArgumentException("You should pass at least one field");
        }
        return applyFilter(object, mode, filterName, new HashSet<>(Arrays.asList(fields)));
    }

    public static MappingJacksonValue applyFilter(Object object, final JsonFilterMode mode, final String filterName, final Set<String> fields) {
        if (fields == null || fields.isEmpty()) {
            throw new IllegalArgumentException("You should pass at least one field");
        }

        SimpleBeanPropertyFilter filter = null;
        switch (mode) {
            case EXCLUDE_FIELD_MODE:
                filter = SimpleBeanPropertyFilter.serializeAllExcept(fields);
                break;
            case INCLUDE_FIELD_MODE:
                filter = SimpleBeanPropertyFilter.filterOutAllExcept(fields);
                break;
        }

        FilterProvider filters = new SimpleFilterProvider().addFilter(filterName, filter);
        MappingJacksonValue mapping = new MappingJacksonValue(object);
        mapping.setFilters(filters);
        return mapping;
    }
}

-5

আপনার সত্তা শ্রেণিতে অ্যাড @JsonInclude(JsonInclude.Include.NON_NULL) সমস্যাটি সমাধান করতে টীকা

এটা দেখতে হবে

@Entity
@JsonInclude(JsonInclude.Include.NON_NULL)

সম্পূর্ণ অপ্রাসঙ্গিকভাবে উত্তর। প্রশ্নের উদ্দেশ্য অন্যরকম যখন উত্তরটি অন্য কোনও বিষয়। এর জন্য -1
হামাদ দার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.