ละเว้นฟิลด์จากออบเจ็กต์ Java แบบไดนามิกในขณะที่ส่งเป็น JSON จาก Spring MVC


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;
    }
}

ในตัวควบคุม Spring MVC โดยใช้ DAO ฉันสามารถรับวัตถุได้ และส่งคืนเป็น JSON Object

@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;
    }
}

ดูส่วนหนึ่งเสร็จโดยใช้ AngularJS ดังนั้นจะได้รับ JSON เช่นนี้

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

หากฉันไม่ต้องการตั้งรหัสผ่านที่เข้ารหัสฉันจะตั้งค่าฟิลด์นั้นเป็นโมฆะด้วย

แต่ฉันไม่ต้องการแบบนี้ฉันไม่ต้องการส่งฟิลด์ทั้งหมดไปยังฝั่งไคลเอ็นต์ หากฉันไม่ต้องการรหัสผ่านอัพเดตโดยสร้างโดยฟิลด์ที่จะส่งผลลัพธ์ของฉัน JSON ควรเป็นอย่างไร

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

รายการฟิลด์ที่ฉันไม่ต้องการส่งไปยังไคลเอนต์ที่มาจากตารางฐานข้อมูลอื่น ดังนั้นมันจะเปลี่ยนไปตามผู้ใช้ที่ล็อกอินฉันจะทำได้อย่างไร?

ฉันหวังว่าคุณจะมีคำถาม


คุณจะพูดอะไรเกี่ยวกับคำตอบนี้? stackoverflow.com/a/30559076/3488143
Iryna

ข้อมูลนี้อาจเป็นประโยชน์stackoverflow.com/questions/12505141/…
Musa

คำตอบ:


149

เพิ่มไฟล์ @JsonIgnoreProperties("fieldname")คำอธิบายประกอบลงใน POJO ของคุณ

หรือคุณสามารถใช้@JsonIgnoreก่อนชื่อของเขตข้อมูลที่คุณต้องการละเว้นในขณะที่แยกการกำหนดค่า JSON ตัวอย่าง:

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

ตัวอย่าง GitHub


66
ฉันสามารถทำแบบไดนามิกได้หรือไม่? ไม่ได้อยู่ใน POJO? ฉันสามารถทำได้ในคลาส Controller ของฉันหรือไม่?
iCode

3
@iProgrammer: ที่นี่คล้ายกับที่คุณต้องการ: stackoverflow.com/questions/8179986/…
user3145373 ツ

3
@iProgrammer: คำตอบที่น่าประทับใจมากที่นี่stackoverflow.com/questions/13764280/…
user3145373 ツ

12
หมายเหตุ: @JsonIgnoreเป็นไม่ได้com.fasterxml.jackson.annotation.JsonIgnore org.codehaus.jackson.annotate.JsonIgnore
xiaohuo

6
ซึ่งจะละเว้นทั้งในขณะที่อ่านจากคำขอและขณะส่งการตอบกลับ ฉันต้องการละเว้นในขณะที่ส่งการตอบกลับเท่านั้นเพราะฉันต้องการคุณสมบัตินั้นจากออบเจ็กต์คำขอ ความคิดใด ๆ ?
zulkarnain shah

33

ฉันรู้ว่าฉันไปงานปาร์ตี้ช้าไปหน่อย แต่จริงๆแล้วฉันก็เจอเรื่องนี้เช่นกันเมื่อหลายเดือนก่อน โซลูชันที่มีอยู่ทั้งหมดไม่น่าสนใจสำหรับฉันมากนัก (มิกซ์อินฮึ!) ดังนั้นฉันจึงสร้างไลบรารีใหม่เพื่อทำให้กระบวนการนี้สะอาด มีให้ที่นี่หากใครอยากลอง: https://github.com/monitorjbl/spring-json-view 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
ขอบคุณ! นี่เป็นวิธีที่จะไปสำหรับฉัน ฉันต้องการมุมมอง JSON ที่กำหนดเองพร้อมกับวัตถุเดียวกันในสถานที่ต่างๆและ @JsonIgnore ก็ใช้ไม่ได้ ไลบรารีนี้ทำให้มันเสร็จสิ้นลงอย่างง่ายดาย
เจฟฟ์

2
คุณทำให้โค้ดของฉันสะอาดขึ้นและใช้งานง่ายขึ้น ขอบคุณ
anindis

@monitorjbl: นี่ค่อนข้างนอกเส้นทางฉันใช้มุมมอง json และมันช่วยแก้จุดประสงค์ของฉัน แต่ฉันไม่สามารถลงทะเบียนซีเรียลไลเซอร์แบบกำหนดเองสำหรับคลาส java.util.Date (ไม่มีข้อผิดพลาดรันไทม์ / เวลาคอมไพล์) สำหรับสตริงฉันสามารถลงทะเบียนซีเรียลไลเซอร์แบบกำหนดเองได้
Ninad

JsonView ดูเหมือนจะเป็นส่วนหนึ่งของผู้ทำแผนที่วัตถุ Jackson ในขณะนี้
maxeh

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"}

2
นี่คือคำตอบที่ยอดเยี่ยมและเรียบง่าย! ฉันต้องการส่งคืนเป็น JSON เพียงไม่กี่ฟิลด์จากคอมโพเนนต์ที่มีคำอธิบายประกอบ @Configuration และข้ามฟิลด์ภายในทั้งหมดที่รวมอยู่โดยอัตโนมัติ ขอบคุณมาก!
stx

15

เราสามารถทำได้โดยตั้งค่าการเข้าถึงJsonProperty.Access.WRITE_ONLYในขณะประกาศทรัพย์สิน

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

14

ได้คุณสามารถระบุได้ว่าช่องใดที่จะทำให้เป็นอนุกรมเป็นการตอบสนอง JSON และช่องที่จะละเว้น นี่คือสิ่งที่คุณต้องทำเพื่อใช้คุณสมบัติการละเว้นแบบไดนามิก

1) ขั้นแรกคุณต้องเพิ่ม @JsonFilter จาก com.fasterxml.jackson.annotation.JsonFilter ในคลาสเอนทิตีของคุณเป็น.

import com.fasterxml.jackson.annotation.JsonFilter;

@JsonFilter("SomeBeanFilter")
public class SomeBean {

  private String field1;

  private String field2;

  private String field3;

  // getters/setters
}

2) จากนั้นในคอนโทรลเลอร์ของคุณคุณต้องเพิ่มสร้างวัตถุ MappingJacksonValue และตั้งค่าตัวกรองและในท้ายที่สุดคุณต้องส่งคืนวัตถุนี้

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"
}

ที่นี่คุณจะเห็นว่ามันละเว้นคุณสมบัติอื่น ๆ (ในกรณีนี้ field3) ในการตอบสนองยกเว้นคุณสมบัติ field1 และ field2

หวังว่านี่จะช่วยได้


1
@Shafqat Man ขอบคุณมากคุณเป็นผู้ช่วยชีวิตของฉัน ใช้เวลาเกือบวันในการค้นหาฟังก์ชันการทำงานประเภทนี้ วิธีนี้ดูหรูหราและเรียบง่ายขนาดนี้เลยเหรอ? และทำในสิ่งที่ร้องขอ ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
Oleg Kuts

12

เพิ่ม@JsonInclude(JsonInclude.Include.NON_NULL)(บังคับให้แจ็คสันจัดลำดับค่าว่าง) ให้กับคลาสและ@JsonIgnoreในฟิลด์รหัสผ่าน

แน่นอนคุณสามารถตั้งค่า@JsonIgnorecreatedBy และ updatedBy ได้เช่นกันหากคุณต้องการละเว้นเสมอไม่ใช่เฉพาะในกรณีนี้

อัปเดต

ในกรณีที่คุณไม่ต้องการเพิ่มคำอธิบายประกอบลงใน POJO เองตัวเลือกที่ยอดเยี่ยมคือคำอธิบายประกอบ Mixin ของ Jackson ตรวจสอบเอกสารประกอบ


ฉันสามารถทำแบบไดนามิกได้หรือไม่? ไม่ได้อยู่ใน POJO? ฉันสามารถทำได้ในคลาส Controller ของฉันหรือไม่?
iCode

คุณหมายความว่าคุณไม่ต้องการเพิ่มคำอธิบายประกอบใน POJO หรือไม่?
geoand

เพราะบางครั้งฉันอาจต้องการส่งฟิลด์ทั้งหมดไปยังฝั่งไคลเอ็นต์ บางครั้งไม่กี่ช่อง ฟิลด์ที่ฉันควรส่งไปยังฝั่งไคลเอ็นต์ได้รับจากฐานข้อมูลในคลาสคอนโทรลเลอร์เท่านั้น หลังจากนั้นฉันต้องตั้งค่าว่าฟิลด์ใดควรละเว้น
iCode

6

หากฉันเป็นคุณและต้องการทำเช่นนั้นฉันจะไม่ใช้เอนทิตีผู้ใช้ของฉันในเลเยอร์คอนโทรลเลอร์ แต่ฉันสร้างและใช้ UserDto (วัตถุการถ่ายโอนข้อมูล) เพื่อสื่อสารกับเลเยอร์ธุรกิจ (บริการ) และคอนโทรลเลอร์ คุณสามารถใช้ Apache BeanUtils (เมธอด copyProperties) เพื่อคัดลอกข้อมูลจากเอนทิตีผู้ใช้ไปยัง UserDto


3

ฉันได้สร้าง JsonUtil ซึ่งสามารถใช้เพื่อละเว้นฟิลด์ที่รันไทม์ในขณะที่ให้การตอบสนอง

ตัวอย่างการใช้งาน: อาร์กิวเมนต์แรกควรเป็นคลาส POJO (นักเรียน) ใด ๆ และ IgnoreFields คือฟิลด์ที่คั่นด้วยจุลภาคที่คุณต้องการละเว้น

 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 "";
   }
 }    

2

ฉันได้แก้ไขโดยใช้สิ่งที่@JsonIgnore@kryger แนะนำเท่านั้น ดังนั้นผู้เริ่มต้นของคุณจะกลายเป็น:

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

คุณสามารถตั้งค่า@JsonIgnoreของหลักสูตรอยู่บนสนาม, หมาหรือทะเยอทะยานเหมือนที่อธิบายไว้ที่นี่

และหากคุณต้องการป้องกันรหัสผ่านที่เข้ารหัสเฉพาะในด้านการทำให้เป็นอนุกรม (เช่นเมื่อคุณต้องการเข้าสู่ระบบผู้ใช้ของคุณ) ให้เพิ่ม@JsonPropertyคำอธิบายประกอบนี้ในฟิลด์ของคุณ:

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

ข้อมูลเพิ่มเติมที่นี่


1

ฉันพบวิธีแก้ปัญหาสำหรับฉันด้วย Spring and jackson

ขั้นแรกระบุชื่อตัวกรองในเอนทิตี

@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);

}

จากนั้นคุณจะเห็นค่าคงที่กรองชื่อคลาสด้วย FilterProvider เริ่มต้นที่ใช้ในการกำหนดค่าสปริง

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());

}

}

ในที่สุดฉันสามารถระบุตัวกรองเฉพาะใน restConstoller เมื่อฉันต้องการ ...

@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
ทำไมจึงมีปัญหาสำหรับคำถามง่ายๆ
Humoyun Ahmad

1

วาง@JsonIgnoreบนสนามหรือจุดเริ่มต้นหรือสร้าง dto ที่กำหนดเอง

@JsonIgnore
private String encryptedPwd;

หรือตามที่กล่าวไว้ข้างต้นโดยceekayใส่คำอธิบายประกอบโดย@JsonPropertyที่แอตทริบิวต์การเข้าถึงถูกตั้งค่าให้เขียนเท่านั้น

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

0

การสร้างUserJsonResponseคลาสและเติมข้อมูลในฟิลด์ที่ต้องการจะเป็นวิธีที่สะอาดกว่าไม่ใช่หรือ?

การส่งคืน JSON โดยตรงดูเหมือนจะเป็นทางออกที่ดีเมื่อคุณต้องการคืนโมเดลทั้งหมด มิฉะนั้นมันจะยุ่ง

ในอนาคตตัวอย่างเช่นคุณอาจต้องการมีฟิลด์ JSON ที่ไม่ตรงกับฟิลด์ Model ใด ๆ จากนั้นคุณจะประสบปัญหาใหญ่ขึ้น


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 สำหรับสิ่งนั้น
Hammad Dar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.