簡體   English   中英

Spring Boot API返回不帶標簽的json

[英]Spring Boot API returns json without labels

我正在使用Java Spring Boot構建一個Rest API,遇到一個問題,我在下面的類中使用了一種方法(出於測試目的,該類在我的控制器中,稍后將其邏輯發送給服務):

@RestController
@RequestMapping("/api/readings")
public class Readings {
    @Autowired
    private ReadingService readingService;

    @RequestMapping(method = RequestMethod.GET, produces = "application/json")
    public List<Reading> getRelevant(@RequestParam("start") String start, @RequestParam("end") String end){
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:MM:SS");
        start += " 00:00:00";
        end += " 23:59:59";
        try {
            Date startdate = df.parse(start);
            Date enddate = df.parse(end);
            return readingService.getRelevant(startdate, enddate);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }
}

這利用了調用以下存儲庫功能的服務:

@Query("SELECT pmtwofive, pmten, recording FROM Reading WHERE recording >= ?1 AND recording <= ?2")
List<Reading> getRelevant(Date start, Date end);

一切工作正常,除了結果的格式:

[[10,20,1505801743816],[14,21,1505802311976],[14,21,1505802330610],[10,13,1505803302960],[10,13,1505803321966]]

取而代之的是,我期望從休眠狀態查詢整個表而不是這三個值時使用CrudRepository時會得到類似的結果:

{
    {
        pmtwofive: 10,
        pmten: 20,
        reading: 1505801743816
    },
    {
        ...
    }
}

我應該怎么做才能獲得預期的結果? 謝謝!

Reading Class:

package com.amione.models;

import javax.persistence.*;
import java.sql.Timestamp;

@Entity
public class Reading {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "serial")
    private long reading_id;

    private int sensor_id;
    private int function;
    private int directionstart;
    private int pmtwofive;
    private int pmten;
    private int checksumlow;
    private int checksumhigh;
    private Timestamp recording;

    public long getReading_id() {
        return reading_id;
    }

    public void setReading_id(int reading_id) {
        this.reading_id = reading_id;
    }

    public int getSensor_id() {
        return sensor_id;
    }

    public void setSensor_id(int sensor_id) {
        this.sensor_id = sensor_id;
    }

    public int getFunction() {
        return function;
    }

    public void setFunction(int function) {
        this.function = function;
    }

    public int getDirectionstart() {
        return directionstart;
    }

    public void setDirectionstart(int directionstart) {
        this.directionstart = directionstart;
    }

    public int getPmtwofive() {
        return pmtwofive;
    }

    public void setPmtwofive(int pmtwofive) {
        this.pmtwofive = pmtwofive;
    }

    public int getPmten() {
        return pmten;
    }

    public void setPmten(int pmten) {
        this.pmten = pmten;
    }

    public int getChecksumlow() {
        return checksumlow;
    }

    public void setChecksumlow(int checksumlow) {
        this.checksumlow = checksumlow;
    }

    public int getChecksumhigh() {
        return checksumhigh;
    }

    public void setChecksumhigh(int checksumhigh) {
        this.checksumhigh = checksumhigh;
    }

    public Timestamp getRecording() {
        return recording;
    }

    public void setRecording(Timestamp recording) {
        this.recording = recording;
    }
}

好吧,我有答案。 必須使用自定義構造函數完成:

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
public class City extends AbstractEntity {

@Column
private String name;

@Embedded
private Geopoint centre=new Geopoint();

public City(){}
public City(String name){
    this.setName(name);
    }
//  @OneToMany(mappedBy="city")
//  private Set<Place> places;

}

庫:

public interface CityRepository extends JpaRepository<City, Long>{

    City findOneByName(String name);
    @Query("SELECT name FROM City")
    public List<City> findMethod1();

    @Query("SELECT c.name FROM City c")
    public List<City> findMethod2();

控制器:

@Autowired
private CityRepository cityRepository;
@GetMapping("/test")
public List<City> test(){
    List<City> ret=new ArrayList();
    ret.addAll(cityRepository.findMethod1());
    ret.addAll(cityRepository.findMethod2());
    ret.addAll(cityRepository.findMethod3());
    return ret;
}

結果:

在此處輸入圖片說明

如您所見,第3種方法有效。 我告訴過你它會來的。

由於仍然對空值進行序列化,因此您可以使用DTO對象封裝僅必需的字段(並SELECT new EntityDTO(field1,field2,field3) FROM Entity

另一個選擇是將傑克遜配置為不使用注釋或配置序列化空值,但這超出了問題的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM