2016-02-02 15 views
5

Tôi đang sử dụng api 4.x. Chúng tôi có một yêu cầu để lọc các trường trong phản hồi dựa trên các tham số yêu cầu.Các trường lọc api mùa xuân còn lại trong câu trả lời

đối tượng tài khoản của tôi:

private class UserResource { 
    private String userLastName; 
    private String userFirstName; 
    private String email; 
    private String streetAddress; 
} 

E.g. URL: curl -i http://hostname:port/api/v1/users?fields=firstName,lastName. 

Trong trường hợp này tôi cần phải trả lại chỉ các lĩnh vực mà trong "lĩnh vực" yêu cầu param. Đầu ra JSON chỉ nên chứa firstName, lastName.

Có một số cách lọc các trường trong Jackson dựa trên đối tượng. Trong trường hợp của tôi, tôi cần phải lọc tự động bằng cách chuyển danh sách các trường tới bộ nối tiếp Jackson.

Vui lòng chia sẻ một số ý tưởng.

Trả lời

1

Sử dụng ResponseBodyAdvice để thay đổi phản hồi trước khi được ghi vào phản hồi HTTP. Trong phương thức beforeBodyWrite(...) bạn có quyền truy cập vào số ServerHttpRequest hiện tại mà bạn có thể đọc giá trị fields. Lời khuyên cơ thể của bạn sẽ trông giống như sau:

@ControllerAdvice 
public class MyResponseBodyAdvisor implements ResponseBodyAdvice<UserResource> { 
    @Override 
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { 
     return returnType.getParameterType().equals(UserResource.class); 
    } 

    @Override 
    public UserResource beforeBodyWrite(UserResource body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { 
     String fields = ((ServletServerHttpRequest) request).getServletRequest().getParameter("fields"); 
     // body.set...(null) for each field not in fields 

     return body; 
    } 
} 
+0

Hi Ali, Trong giải pháp của bạn, chúng tôi đang tạo trường trống. Nhưng tôi không muốn hiển thị trường cả. Tôi đã thực hiện như mô tả trong SPR-12586. Cảm ơn. – Raj

+0

Chú thích dto của bạn với '@ JsonInclude' để xóa các trường' trống' khỏi phản hồi –

0

Nó xuất hiện này được hỗ trợ trong mùa xuân 4.2 theo https://jira.spring.io/browse/SPR-12586 qua Jackson JsonFilter (mặc dù jira được trả lại một lỗi tại thời điểm này).

+0

Xin chào Ben, Cảm ơn bạn đã phản hồi. Nó rất hữu ích. – Raj

+0

Đây là giải pháp của tôi. MappingJacksonValue mappingJacksonValue = new MappingJacksonValue (MyObject); Trong bộ điều khiển của bạn chỉ cần trả về mappingJacksonValue. đảm bảo MyObject có chú thích @JsonFilter ("myObject"). – Raj

3

Cảm ơn Ali. Nó là một sự trợ giúp tuyệt vời. Hãy để tôi thực hiện nó ngày hôm nay. Tôi sẽ đăng kết quả

@JsonFilter("blah.my.UserEntity") 
public class UserEntity implements Serializable { 
//fields goes here 
} 

@RequestMapping(value = "/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public MappingJacksonValue getUsers(@RequestParam MultiValueMap<String, String> params) { 
//Build pageable here 
Page<UserEntity> users = userService.findAll(pageable); 

    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(users); 
    FilterProvider filters = new SimpleFilterProvider() 
       .addFilter("blah.my.UserEntity", SimpleBeanPropertyFilter 
         .filterOutAllExcept("userFirstName")); 
    mappingJacksonValue.setFilters(filters); 
    return mappingJacksonValue; 
} 
+0

Điều này rất hữu ích đối với tôi –

Các vấn đề liên quan