【问题标题】:Spring Boot API returns json without labelsSpring Boot API 返回没有标签的 json
【发布时间】:2017-09-19 22:28:38
【问题描述】:

我正在使用 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;
    }
}

【问题讨论】:

  • 你的阅读课是什么样子的?
  • @caiocpricci2 我用添加的课程更新了问题!
  • 你从哪里得到[[10,20,1505801743816],[14,21,1505802311976],[14,21,1505802330610],[10,13,1505803302960],[10,13,1505803321966]] ???它来自您的客户端吗?或者你只是从你的服务器端打印它?
  • 客户端,正在运行:http://localhost:8000/api/readings?start=2017-09-19&amp;end=2017-09-19
  • 检查如果您使用 findAll()findOne() 代替您的计划查询,甚至是 return new Reading() 并填写了一些数据,是否会出现相同的结果。这只是为了排除该存储库正在做某事喜欢这里。

标签: java json spring hibernate


【解决方案1】:

好的,我有答案了。必须使用自定义构造函数来完成:

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

结果:

如您所见,第三种方法有效。我告诉过你它会出现的。

由于空值仍被序列化,您可以使用 DTO 对象仅封装必需的字段(和SELECT new EntityDTO(field1,field2,field3) FROM Entity

另一种选择是将 Jackson 配置为不使用注释或配置序列化空值,但这超出了问题的范围。

【讨论】:

  • 谢谢,一旦有机会我会尝试一下,然后来 bsck 更新这个!
猜你喜欢
  • 2017-06-27
  • 2021-01-01
  • 2017-06-10
  • 1970-01-01
  • 2021-04-25
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多