[email protected]坑
@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;
}
结果:
如果方法上不添加@JsonView(User.UserInfo.class):
结果:有的数据前端并不想要。
注意:写个目的为了记录这会遇到的坑。
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<MediaType> 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<Converter> 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,"成功");
}
代码:https://github.com/timeday/springboot-validateexception.git