如何在弹簧应用中注册自定义jackson滤波器?

问题描述 投票:4回答:3

我读过以下问题:

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

我有spring-mvc应用程序。如果我使用@ResponseBody注释注释控制器方法并在方法内返回对象,则服务器将json提供给客户端。我有杰克逊在课堂上。

在提到的例子中写了以下代码

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

据我所知,这段代码已经写在春天的内部......

请说明如何注册自定义jackson过滤器?

java json spring spring-mvc jackson
3个回答
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,这意味着所有String字段都在您的responseValueObjects转换为json,如果您希望您的对象也转换为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;
        }
    }

最后回复Value对象,注意所有字段都是qazxsw poi

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

这是我项目的实例。我正在使用Spring 4。


0
投票

我找到了临时的解决方案:

<!-- 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>

欢迎任何其他建议

© www.soinside.com 2019 - 2024. All rights reserved.