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