Skip to main content
 首页 » 编程设计

spring-mvc之spring MVC在spring-data页面上使用@JsonView

2025年01月19日10dflying

我在Jhipster项目上使用Spring-MVC,Spring-data-jpa,jackson。

我设法在对象上使用@JsonView注释,当rest Controller 中的方法返回类型ResponseEntity<List<MyObject>>时,它可以很好地工作,但是当方法返回类型为ResponseEntity<Page<MyObject>>时,我不能使其起作用。

我尝试将MapperFeature.DEFAULT_VIEW_INCLUSION设置为true(默认为false)。当我这样做时,所有属性都将被序列化。但是通过@JsonView过滤不再起作用。

我无法修改Page对象,因为它是Spring数据对象。

我正在寻找一种告诉 jackson 包括Page对象的所有属性的方法。

这是我的代码:

我的实体:

@Entity 
@Table(name = "T_REGION") 
public class Region implements Serializable { 
 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
 
    @Column(name = "code", nullable = false) 
    private Integer code; 
 
    @Column(name = "name", length = 60, nullable = false) 
    @JsonView(View.Summary.class) 
    private String name; 
 
    // Getters and setters 
} 

我的休息 Controller :
@RestController 
@RequestMapping("/api") 
public class RegionResource { 
 
    @RequestMapping(value = "/regionsearch1", 
                method = RequestMethod.GET, 
                produces = MediaType.APPLICATION_JSON_VALUE) 
    @JsonView(View.Summary.class) 
    public ResponseEntity<Page<Region>> findAll1( 
        @RequestParam(value = "page" , required = false) Integer offset, 
        @RequestParam(value = "per_page", required = false) Integer limit, 
        Sort sort) 
        throws URISyntaxException { 
        Pageable pageRequest = PaginationUtil.generatePageRequest(offset, limit, sort); 
        Page<Region> page = regionRepository.findAll(pageRequest); 
        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/regionsearch1", pageRequest); 
        return new ResponseEntity<>(page, headers, HttpStatus.OK); 
    } 
 
 
    @RequestMapping(value = "/regionsearch2", 
                method = RequestMethod.GET, 
                produces = MediaType.APPLICATION_JSON_VALUE) 
    @JsonView(View.Summary.class) 
    public ResponseEntity<List<Region>> findAll2( 
        @RequestParam(value = "page" , required = false) Integer offset, 
        @RequestParam(value = "per_page", required = false) Integer limit, 
        Sort sort) 
        throws URISyntaxException { 
        Pageable pageRequest = PaginationUtil.generatePageRequest(offset, limit, sort); 
        Page<Region> page = regionRepository.findAll(pageRequest); 
        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/regionsearch2", pageRequest); 
        return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK); 
    } 
 
} 
findAll1返回:
[ 
  { 
    "name": "Ile-de-France" 
  }, 
  { 
    "name": "Champagne-Ardenne" 
  }, 
  .... 
] 
findAll2返回:
{} 

对象 Page的属性上没有 @JsonView,因此没有序列化任何属性。

即使使用 Page,我也无法找到一种方法来告诉Jackson包括所有 @JsonView属性。

有任何想法吗 ?

请您参考如下方法:

我遇到了同样的问题,我通过将MapperFeature.DEFAULT_VIEW_INCLUSION设置为true来解决了该问题,但是您应该在要使用JsonViewJsonIgnore注释应用 View 的类中为的所有字段注释,以便默认情况下它们不会包含在json 。