Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBootAPI返回不带标签的json_Java_Json_Spring_Hibernate - Fatal编程技术网

Java SpringBootAPI返回不带标签的json

Java SpringBootAPI返回不带标签的json,java,json,spring,hibernate,Java,Json,Spring,Hibernate,我正在用Java Spring Boot构建一个rest API,但遇到了一个问题,我有一个带有方法的类(该类位于我的控制器中,用于测试目的,稍后我会将其逻辑发送到服务): 与此相反,我期望的是使用hibernate中的Crudepository查询我的整个表时得到的结果,而不仅仅是这三个值: { { pmtwofive: 10, pmten: 20, reading: 1505801743816 }, {

我正在用Java Spring Boot构建一个rest API,但遇到了一个问题,我有一个带有方法的类(该类位于我的控制器中,用于测试目的,稍后我会将其逻辑发送到服务):

与此相反,我期望的是使用hibernate中的Crudepository查询我的整个表时得到的结果,而不仅仅是这三个值:

{
    {
        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;

}
@数据
@EqualsAndHashCode(callSuper=true)
@实体
公共类城市扩展抽象实体{
@纵队
私有字符串名称;
@嵌入
私人地质点中心=新地质点();
公共城市(){}
公共城市(字符串名称){
这个.setName(name);
}
//@OneToMany(mappedBy=“城市”)
//私人场所;
}
存储库:

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();
CityRepository公共接口扩展了JpaRepository{
城市findOneByName(字符串名称);
@查询(“从城市中选择名称”)
公共列表findMethod1();
@查询(“从城市c中选择c.name”)
公共列表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;
}
@Autowired
私人城市储蓄所城市储蓄所;
@GetMapping(“/test”)
公共列表测试(){
List ret=new ArrayList();
ret.addAll(cityRepository.findMethod1());
ret.addAll(cityRepository.findMethod2());
ret.addAll(cityRepository.findMethod3());
返回ret;
}
结果是:

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

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

由于空值仍然是序列化的,您可以使用DTO对象仅封装必需的字段(并从实体中选择新的EntityDTO(field1、field2、field3))


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

你的阅读类是什么样子的?@Caiocprici2我用添加的类更新了问题!你从哪里得到的
[[10,201505801743816],[14,211505802311976],[14,211505802330610],[10,13150580302960],[10,13150580331966]
?是从客户端打印的还是从服务器端打印的?客户端,运行:
http://localhost:8000/api/readings?start=2017-09-19&end=2017-09-19
检查如果您使用例如
findAll()
findOne()是否会得到相同的结果
不需要您的计划查询,甚至
返回新的阅读()
并填写一些数据。这只是为了排除存储库正在做一些花哨的事情。谢谢,一旦有机会,我会尝试一下,并来bsck更新此内容!
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;
}