2016-02-02 13 views
5

私はspring rest API 4.xを使用しています。リクエストパラメータに基づいてレスポンスのフィールドをフィルタする必要があります。レスポンスの春休みAPIフィルタフィールド

マイUserオブジェクト:この場合、

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. 

私は、要求のparam「フィールド」であるフィールドのみを返す必要があります。 JSON出力にはfirstName、lastNameのみを含める必要があります。

オブジェクトに基づいてジャクソンのフィールドをフィルタリングする方法はいくつかあります。私の場合は、フィールドのリストをJacksonシリアライザに渡すことで動的にフィルタリングする必要があります。

いくつか考えてください。

答えて

1

応答がHTTP応答に書き込まれる前に応答を変更するには、ResponseBodyAdviceを使用します。 beforeBodyWrite(...)メソッドでは、fields値を読み取ることができる現在のServerHttpRequestにアクセスできます。あなたの体のアドバイスは、次のようになります(JIRAは、現時点ではエラーを返しているが)

@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

あなたの解決策では、私たちはフィールドを空にしています。しかし、私はフィールドを全く表示したくありません。私はSPR-12586に記述されているように実装しました。ありがとう。 – Raj

+0

'@ JsonInclude'であなたのdtoに注釈をつけて、応答から空のフィールドを削除してください –

0

は、ジャクソンJsonFilter経由https://jira.spring.io/browse/SPR-12586ごとに春4.2でサポートされて表示されます。

+0

こんにちはベン、応答に感謝します。とても役に立ちました。 – Raj

+0

私の解決策はここにあります。 MappingJacksonValue mappingJacksonValue =新しいMappingJacksonValue(MyObject);あなたのコントローラでは、mappingJacksonValueを返すだけです。 MyObjectに@JsonFilter( "myObject")注釈が付いていることを確認してください。 – Raj

3

ありがとうアリ。それは大きな助けです。今日はそれを実装しましょう。私は結果を投稿します

@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

これは私にとって非常に役立ちます –