[英]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.