2015-06-24 2 views
4

Я прочитал следующий вопрос:Как зарегистрировать пользовательский фильтр Джексона в весеннем приложении?

https://stackoverflow.com/a/25609465/2674303

У меня есть пружинный MVC приложение. Если я комментирую метод контроллера с помощью метода @ResponseBody аннотации и возврата объекта внутри, то сервер дает json клиентам. У меня есть Джексон в classpath.

В приведенном примере написал следующий код

ObjectMapper mapper = new ObjectMapper(); 
mapper.setFilters(new SimpleFilterProvider().addFilter("filter", new ExcludeIdFilter())); 

Как я понимаю, этот код уже написанный где-то весной внутренностей ...

Просьба уточнить, как зарегистрировать пользовательские джексон фильтр?

+0

Если вы хотите, чтобы объекты, возвращаемые вашими контроллерами, проходили через ваш настраиваемый фильтр, вам придется расширить «MappingJackson2HttpMessageConverter», а затем зарегистрировать новый ' HttpMessageConverter' в вашей конфигурации сервлета. Есть много вопросов о SO, которые охватили это. – woemler

ответ

1

Вы можете настроить свой собственный экземпляр MappingJackson2HttpMessageConverter как это:

@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    @Override 
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 

    ObjectMapper mapper = Jackson2ObjectMapperBuilder().json() 
     .filters(new SimpleFilterProvider().addFilter("filter", new ExcludeIdFilter())); 

    MappingJackson2HttpMessageConverter converter = 
     new MappingJackson2HttpMessageConverter(mapper); 

    // then replace the default MappingJackson2HttpMessageConverter 
    // with your custom one in the list of configured converters 
    } 

} 
1

Вы можете обрабатывать ее с помощью определенного вашего отображения в <mvc:message-converters> приведенном ниже примере используется только StringHttpMessageConverter так это означает, что все поля строк преобразуются в формате JSON в ваших responseValueObjects, если вы хотите, чтобы ваши объекты также конвертировать в формат JSON вы должны написать свой заказ сообщение конвертор и установите его на <mvc:message-converters>.

весна-servlet.xml

<!-- Activate to Spring MVC annotion like @RequestMapping or @Controller --> 
    <mvc:annotation-driven> 
     <mvc:message-converters> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
      <bean 
       class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /> 
     </mvc:message-converters> 
    </mvc:annotation-driven> 

Предположим, вы запрашиваете пользователей, ниже класс контроллера.

@Controller 
@RequestMapping(value = "api/queryUser") 
public class ApiQueryUser { 
    @Autowired 
    private UserService userService; 

    @Autowired 
    private ValidationService validationService; 

     @RequestMapping(method = RequestMethod.POST) 
     @ResponseBody 
     public UserResponseValue queryUser(HttpServletRequest request) { 
      UserResponseValue userResponseValue = new UserResponseValue(); 
      String userName = request.getParameter("USERNAME"); 
      String password = request.getParameter("PASSWORD"); 
      String email = request.getParameter("EMAIL"); 
      try { 
       // validationService.validateParamaterNotNull(userName, password); 
       BR_User user = userService.queryUser(userName, password, email); 
       userResponseValue.setUserName(user.getUserName()); 
       userResponseValue.setEmail(user.getEmail()); 
       userResponseValue.setRole(user.getRole()); 
       userResponseValue.setResponseCode("100"); 
       userResponseValue.setResponseMessage("User exist"); 
      } catch (ValidationException e) { 
       userResponseValue.setResponseCode("99"); 
       userResponseValue.setErrorCode(e.getErrorCode().name()); 
      } catch (ApiException e) { 
       userResponseValue.setResponseCode("98"); 
       userResponseValue.setErrorCode(e.getErrorCode().name()); 
      } catch (Exception e) { 
       userResponseValue.setResponseCode("96"); 
       userResponseValue.setErrorCode(ErrorCode.ERR20000.name()); 
      } 
      return userResponseValue; 
     } 
    } 

наконец responseValue объект, заботиться, что все fileds являются String

public class UserResponseValue{ 
    private String userName; 
    private String role; 
    private String email; 

    public String getUserName() { 
     return userName; 
    } 

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

    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

и убедитесь, что Джексон зависимость добавляется в ваш pom.xml

<!-- To use responseBody as a default JSON messageConverter --> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-core</artifactId> 
      <version>2.5.1</version> 
     </dependency> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <version>2.5.1</version> 
     </dependency> 

Это рабочий пример из моего проекта , Я использую Spring 4.

0

Я нашел временное это решение:

@ControllerAdvice 
public class JsonFilterAdvice implements ResponseBodyAdvice<List<?>> 
{ 

    @Override 
    public List<?> beforeBodyWrite(
     List<?> arg0, 
     MethodParameter arg1, 
     MediaType arg2, 
     Class<? extends HttpMessageConverter<?>> arg3, 
     ServerHttpRequest arg4, 
     ServerHttpResponse arg5) 
    { 
     HttpServletRequest servletRequest = ((ServletServerHttpRequest) arg4).getServletRequest(); 
     String[] params = servletRequest.getParameterValues("filters"); 
     if (params != null) 
     { 
     // parse object and set field to null 
     } 
     return arg0; 
    } 

    @Override 
    public boolean supports(MethodParameter arg0, Class<? extends HttpMessageConverter<?>> arg1) 
    { 
     // return true if method parameters contain 'filters' field 
     return true; 
    } 

любые другие предложения приветствуются

Смежные вопросы