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

时间:2015-05-13 17:04:51

标签: spring-mvc jackson spring-data-jpa jhipster

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

我设法在一个对象上使用@JsonView注释,当其余控制器中的方法返回一个类型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
}

我的休息控制器:

@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,我也找不到告诉杰克逊包含所有@JsonView属性的方法。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

返回所有页面元素的另一种方法是为Page接口创建自己的实现(包括你想要的JsonView):

<强> JsonPage

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

<强>控制器

private void takePic() {
    Intent cameraIntent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, 2);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 2) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        File file = writebitmaptofilefirst("route_image",photo);
        Uri uri = Uri.fromFile(file);
        fileToDelete = file;
        Intent sendIntent = new Intent(Intent.ACTION_SEND);
        sendIntent.putExtra("address", "8001111222");
        sendIntent.putExtra(Intent.EXTRA_STREAM, uri);
        sendIntent.setType("image/jpg");
        startActivityForResult(sendIntent,3);
    }
    else if (requestCode == 3){
        if (fileToDelete.exists()) fileToDelete.delete();
    }
}

public static File writebitmaptofilefirst(String filename, Bitmap source) {
    String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
    File mFolder = new File(extStorageDirectory + "/temp_images");
    if (!mFolder.exists()) {
        mFolder.mkdir();
    }
    OutputStream outStream = null;
    File file = new File(mFolder.getAbsolutePath(), filename + ".jpg");
    if (file.exists()) {
        file.delete();
        file = new File(extStorageDirectory, filename + ".jpg");
        Log.e("file exist", "" + file + ",Bitmap= " + filename);
    }
    try {
        outStream = new FileOutputStream(file);
        source.compress(Bitmap.CompressFormat.JPEG, 90, outStream);
        outStream.flush();
        outStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    Log.e("file", "" + file);
    return file;

}

答案 1 :(得分:6)

我这样做了,它运作良好

 

    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();
        }

       }
    }

此致

RégisLIMARE

答案 2 :(得分:0)

我遇到了同样的问题,我通过将MapperFeature.DEFAULT_VIEW_INCLUSION设置为true来解决此问题,但您应该在要使用{{1}应用视图的类中注释所有字段 }或JsonView注释,因此默认情况下它们不会包含在json中。

答案 3 :(得分:0)

我知道这是一个古老的问题,但是您可以对对象页面使用类似的内容

@Configuration
public class JacksonAdapter implements WebMvcConfigurer {

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

    public class JsonPageSerializer extends JsonSerializer<Page> {

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

            ObjectMapper om = new ObjectMapper().disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
            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();
        }

    }
}