Spring MVC uses @JsonView on spring -data page

I am using Spring-MVC, Spring-data-jpa, jackson in a Jhipster project.

I managed to use the annotation @JsonViewfor the object, and it works well when the method in the rest of the controller returns a type ResponseEntity<List<MyObject>>, but I cannot get it to work when the type of the returned method ResponseEntity<Page<MyObject>>.

I tried to set MapperFeature.DEFAULT_VIEW_INCLUSIONto true (the default value is false). When I do this, all attributes are serialized. But filtering through @JsonViewno longer works.

I cannot modify the object Pagebecause it is a Spring -data object.

I am looking for a way to tell Jackson to include all the attributes of an object Page.

Here is my code:

My essence:

@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
}

My break 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 returns:

[
  {
    "name": "Ile-de-France"
  },
  {
    "name": "Champagne-Ardenne"
  },
  ....
]

findAll2 returns:

{}

Page @JsonView , .

Jackson Page, @JsonView.

?

+4
3

, , MapperFeature.DEFAULT_VIEW_INCLUSION true, , JsonView JsonIgnore, json.

0

- ( JsonView):

JsonPage

public class JsonPage<T> extends org.springframework.data.domain.PageImpl<T> {

public JsonPage(final List<T> content, final Pageable pageable, final long total) {
    super(content, pageable, total);
}

public JsonPage(final List<T> content) {
    super(content);
}

public JsonPage(final Page<T> page, final Pageable pageable) {
    super(page.getContent(), pageable, page.getTotalElements());
}

@JsonView(JsonViews.UiView.class)
public int getTotalPages() {
    return super.getTotalPages();
}

@JsonView(JsonViews.UiView.class)
public long getTotalElements() {
    return super.getTotalElements();
}

@JsonView(JsonViews.UiView.class)
public boolean hasNext() {
    return super.hasNext();
}

@JsonView(JsonViews.UiView.class)
public boolean isLast() {
    return super.isLast();
}

@JsonView(JsonViews.UiView.class)
public boolean hasContent() {
    return super.hasContent();
}

@JsonView(JsonViews.UiView.class)
public List<T> getContent() {
    return super.getContent();
}
}

:

@Override
public Page<User> findAll(final int page) {
    PageRequest pr = new PageRequest(page, pageSize, new Sort(Sort.Direction.DESC, "dateCreated"));
    return new JsonPage<User>(userRepository.findAll(pr), pr);
}

@JsonView(JsonViews.UiView.class)
@RequestMapping(method = RequestMethod.GET, value = "{page}")
public Page<User> getUsers(@PathVariable final int page) {
    return userService.findAll(page);
}
+5

I did it, it worked well

 

    package com.natixis.spring.ws.configuration;
    import java.io.IOException;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.domain.Page;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

    import com.fasterxml.jackson.annotation.JsonInclude.Include;
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.MapperFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.databind.SerializerProvider;

    @Configuration
    public class JacksonAdapter extends WebMvcConfigurerAdapter {

        @Bean
        public Jackson2ObjectMapperBuilder jacksonBuilder() {
            return  new Jackson2ObjectMapperBuilder()
                    .failOnUnknownProperties(false)
                    .serializationInclusion(Include.NON_EMPTY)
                    .serializerByType(Page.class, new JsonPageSerializer());

        }

       public class JsonPageSerializer extends JsonSerializer>{

        @Override
        public void serialize(Page page, JsonGenerator jsonGen, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

            ObjectMapper om=new ObjectMapper()
                    .disable(MapperFeature.DEFAULT_VIEW_INCLUSION)
                    .setSerializationInclusion(Include.NON_EMPTY);
            jsonGen.writeStartObject();
            jsonGen.writeFieldName("size");
            jsonGen.writeNumber(page.getSize());
            jsonGen.writeFieldName("number");
            jsonGen.writeNumber(page.getNumber());
            jsonGen.writeFieldName("totalElements");
            jsonGen.writeNumber(page.getTotalElements());
            jsonGen.writeFieldName("last");
            jsonGen.writeBoolean(page.isLast());
            jsonGen.writeFieldName("totalPages");
            jsonGen.writeNumber(page.getTotalPages());
            jsonGen.writeObjectField("sort", page.getSort());
            jsonGen.writeFieldName("first");
            jsonGen.writeBoolean(page.isFirst());
            jsonGen.writeFieldName("numberOfElements");
            jsonGen.writeNumber(page.getNumberOfElements());
            jsonGen.writeFieldName("content");
            jsonGen.writeRawValue(om.writerWithView(serializerProvider.getActiveView())
                    .writeValueAsString(page.getContent()));
            jsonGen.writeEndObject();
        }

       }
    }

Hi,

Régis LIMARE

+5
source

All Articles