How to register custom jackson filter in spring application?

I read the following question:

stack overflow

I have a spring -mvc application. If I comment on the controller method using the @ResponseBodyannotation and return object inside the method, then the server gives json to the clients. I have Jackson in a classpath.

The following code is written in the above example.

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

As I understand it, this code is already written somewhere in spring internal ...

Please explain how to register a custom Jackson filter?

+4
source share
3 answers

You can configure your own instance MappingJackson2HttpMessageConverteras follows:

@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
source

<mvc:message-converters> StringHttpMessageConverter, String json responseValueObjects, , jSon, <mvc:message-converters>.

spring -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.

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

}

, Jackson ​​ 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.

+1

:

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

Any other suggestions are welcome.

0
source

All Articles