Springboot-@JsonView--坑

   @JsonView:项目中后端给前端返回不同的数据,这个时候需要些很多的相同代码,很繁琐笨重。使用@JsonView可以帮助我们更好的解决这个问题。但是也哟很多需要注意的地方。

利用@jsonView注解来实现自定义返回字段:
需要三步即可:
      第一:用接口来声明多个视图
      第二:在值对象的get方法上指定视图
      第三:在controller方法上指定视图
步骤:
@Data
@NoArgsConstructor
public class User {
    //通过不同的接口控制给前端显示不同的数据
    public interface UserInfo{};
    public interface UserDetail extends UserInfo{}; //继承
    @NotBlank(message = "{user.name.notblank}")
    protected String name;
    @Range(max = 150, min = 1, message = "年龄范围应该在1-150内。")
    private Integer age;
    private Integer bianhao;
    private String address;
    @PhoneVerification
    private String phone;
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
    @NotEmpty(message = "密码不能为空")
    @Length(min = 6, max = 8, message = "密码长度为6-8位。")
    @Pattern(regexp = "[a-zA-Z]*", message = "密码不合法")
    private String password;
    // 如果方法上还有 JsonView(UserInfo.class) 则 给前端展示 这个属性
    @JsonView(UserInfo.class)
    public String getName() {
        return name;
    }
    // 如果方法上还有 JsonView(UserDetail.class) 则 给前端展示 这个属性
    @JsonView(UserDetail.class)
    public String getPassword() {
        return password;
    }

}

此处只是给 getName()添加了UserInfo.class 接口

 @RequestMapping("/getUser")
    @JsonView(User.UserInfo.class)
    public User getUser(@Validated UserRequest userRequest){
        User user=new User();
        user.setAddress("ssssssss");
        user.setAge(20);
        user.setBianhao(58588);
        user.setName("天狗食日");
        return user;
    }

结果:

Springboot-@JsonView--坑_第1张图片

如果方法上不添加@JsonView(User.UserInfo.class):

结果:有的数据前端并不想要。

Springboot-@JsonView--坑_第2张图片

注意:写个目的为了记录这会遇到的坑。

1.如果项目中修改了FastJsonHttpMessageConverter------HttpMessageConverters 这个注解无法生效。

@Bean
    public HttpMessageConverters fastJsonHttpMessageConverters(){
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.PrettyFormat);
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        List fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter converter = fastJsonHttpMessageConverter;
        return new HttpMessageConverters(converter);

    }
    */
/**
     * 配置非json格式的请求体的converter
     **//*

    @Bean
    public ConversionService conversionService(){
        ConversionServiceFactoryBean conversionServiceFactoryBean = new ConversionServiceFactoryBean();
        Set converters = new HashSet<>();
        converters.add(new StringToDateConverter());
        conversionServiceFactoryBean.setConverters(converters);
        conversionServiceFactoryBean.afterPropertiesSet();
        return conversionServiceFactoryBean.getObject();
    }

因:该注解是 com.fasterxml.jackson.annotation.JsonView。如果将json需改成com.alibaba.fastjson.serializer。。。无法生效。没找出来原因。头大。

2.如果添加了@JsonView的返回类被重新封装,这个时候这个注解不生效。

如:

 /**
     * 结果是空的
     * @param userRequest
     * @return
     */
    @RequestMapping("/getUserOne")
    @JsonView(User.UserInfo.class)
    public RestResultWrapper getUserOne(@Validated UserRequest userRequest){
        User user=new User();
        user.setAddress("ssssssss");
        user.setAge(20);
        user.setBianhao(58588);
        user.setName("天狗食日");
        return new RestResultWrapper(user,0,"成功");
    }

Springboot-@JsonView--坑_第3张图片

代码:https://github.com/timeday/springboot-validateexception.git 

你可能感兴趣的:(Springboot)