我用@JsonView注释了类User,当它返回时,我看到了所有字段,甚至是视图类中不包含的字段。这是我的班级
@Entity
@Table(name = "users")
public class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@Column(name="id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userID;
@JsonView(View.Summary.class)
@Column(name="email")
private String email;
@JsonView(View.Summary.class)
@Column(name="user_name")
private String firstName;
@JsonView(View.Summary.class)
@Column(name="user_last_name")
private String lastName;
@JsonView(View.Summary.class)
@Column(name="phone")
private String phone;
@JsonView(View.Summary.class)
@Column(name="origin")
private String address;
@JsonView(View.Summary.class)
@Column(name="birth_date")
private Long birthDate;
@JsonView(View.Summary.class)
@Column(name="gender")
private Long gender;
@JsonView(View.Summary.class)
@Column(name="about_me")
private String aboutMe;
@JsonView(View.SummaryWithPhoto.class)
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name="photo")
private Photo avatar;
@JsonView(View.SummaryWithSession.class)
@Transient
private UserSession session;
//getters and setters
这是我的View类
public class View {
public interface Summary {}
public interface SummaryWithPhoto extends Summary {}
public interface SummaryWithSession extends SummaryWithPhoto {}
}
所以,然后我请求带有@JsonView(View.SummaryWithPhoto.class)
注释的get方法,我总是得到userID字段,但不应该。这是端点代码
@JsonView(View.SummaryWithPhoto.class)
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<User> getUser(@RequestHeader(value="Access-key") String accessKey,
@RequestHeader(value="Secret-key") String secretKey)
我花了一些时间调试同样的问题。结果是:
-
如果不更改此行为,则默认情况下会包括所有字段(请参见
BeanSerializerFactory.processViews
(。更改默认操作:ObjectMapper mapper = new ObjectMapper(); mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
-
字段,如果控制器方法注释有OTHER
@JsonView
(参见FilteredBeanPropertyWriter.serializeAsField
(,则结果中省略@JsonView
标记
因此,对于您的用例,不要更改默认设置,请用@JsonView
注释Long userID
,用任何其他(不相同(视图注释getUser
。
代码comfasterxmljacksoncorejackson-databind2.8.4jackson-databind-2.8.4-sources.jar!comfasterxmljacksondatabindMapperFeature.java
* Feature is enabled by default.
*/
DEFAULT_VIEW_INCLUSION(true)
与博客相矛盾https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring,所以我必须仔细查看代码。