当前位置: 首页 > 知识库问答 >
问题:

为什么spring boot会返回一些值为null的json?

杭志泽
2023-03-14

我正在做一个练习游戏。

我有一个Spring引导/Maven项目连接到MySQL数据库。我能够设置一个api,它只是从我的“所有谜语”表中检索所有内容。它以前工作过,但是现在api返回一个json,其中一些键的值为空。我唯一玩的是Spring引导文件上的application.properties。我在spring.jpa.hibernate.ddl的“更新”和“无”之间跳跃。我到底做错了什么?

application.properties

spring.jpa.hibernate.format_sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 
spring.datasource.url=jdbc:mysql://localhost:3306/riddlesgame
spring.datasource.username=root
spring.datasource.password=RiddlesGame886
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.data.rest.base-path=/api/v1
server.port=8088

这是数据库表和预期列

这是返回的json,带有错误的空值

这是模型

@Entity
@Table(name = "allriddles")
public class Riddle {

/*
 * ATTRIBUTES
 */
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String title;
private int difficulty;
private String prize;
private String riddlerName;
private int levels;
private String riddleDescription;

/*
 * CONSTRUCTORS
 */
public Riddle() {}
public Riddle( String title, int difficulty, String prize, String riddlerName, int levels,
        String description) {
    super();
    
    this.title = title;
    this.difficulty = difficulty;
    this.prize = prize;
    this.riddlerName = riddlerName;
    this.levels = levels;
    this.riddleDescription = description;
}
}

这是我调用服务的控制器

 @RestController
 public class GetRiddles {

@Autowired
RiddlesService rs; 


@RequestMapping("/Riddles")
public List<Riddle> getAllRiddles(){
    return rs.getAllRiddles();
}

调用crud的服务

@Service
public class RiddlesService {

@Autowired
RiddlesRepository riddlesRepository;

public List<Riddle> getAllRiddles(){
    List<Riddle> riddles = new ArrayList<>();
    riddlesRepository.findAll()
    .forEach(riddles::add);
    

    return riddles;
}

crud接口

public interface RiddlesRepository extends CrudRepository<Riddle, Integer> {

}

最后是控制台输出,如果有帮助的话

共有2个答案

吴开宇
2023-03-14

这是hibernate根据实体中定义的字段命名表中列的默认方式。

重写您可以使用的默认行为

@Column(name = "riddleName")
private String riddlerName;

@Column(name = "riddleDescription")
private String riddleDescription;
夏星阑
2023-03-14

我尝试了同样的方法,得到了相似的结果。正如你所说,这是在修改spring时发生的。jpa。冬眠ddl自动更新。它最终增加了两个新的专栏。

Hibernate: alter table allriddles add column riddle_description varchar(255)
Hibernate: alter table allriddles add column riddler_name varchar(255)

最初的列名是riddleDescription和riddlerName,这些列名保留了现有的值。但新列中不会包含数据。所以假设我重现了你的问题,你要么

  • 在数据库中:将数据从旧列(不带下划线)移动到新列(带下划线)并删除旧列。或

我想你可能在某个时候也改变了这些属性名的大小写。因为camelcase属性将以下划线(例如代码-名称)的形式映射到数据库-

 类似资料:
  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 这是简单的代码,我没有得到设置位图的结果,而是得到了null。谁能告诉我我在哪里犯错了? 更新 好的,所以我无法像我想的那样将文本转换为图像。这样呢 这会创建位图吗? 问题答案: 从文档中: 返回 解码的位图;如果无法解码图像,则 返回 null。 字符串“ test”中涉及的字节不是有效的位图,对吗? 如果将文本“ test”保存在名为or 等的文件中,并试图在Windows中打开它

  • 问题内容: 我已经存储了在该数据库中插入并插入记录的过程。我想获取最后插入的记录的ID。返回NULL并返回正确的ID,为什么会发生?如我所读,因此最好在表上有一些触发器的情况下使用。我可以使用吗?不论触发器如何,它是否都在表的范围内返回ID? 那么问题是什么以及使用什么呢? 已编辑 问题答案: 就像奥德(Oded)所说的那样,问题在于您在执行之前要先询问身份。 作为解决方案,最好尽可能地接近运行。

  • 我正在尝试访问项目中的文件。但是getResource方法返回null。 以及eclipse工作区中项目文件夹的外观: 为什么啊?我想访问我的资产文件夹中的文件? 编辑我创建了一个jar文件,这是jar的内容: 已解决 首先,我有很多图像文件,所以我想把它们组织在一个文件夹中。我把assets文件夹放在src目录中,最后我能够访问这些文件。

  • 我的jar中有一个图像,我正试图加载它,但是getResourceAsStream()总是返回null。 目录结构: 所容纳之物爪哇: 一般内容。爪哇: StackTrace: 我不知道为什么类加载器找不到图像。我已经在编译的jar中查看过了,文件在那里,并且在油漆中打开很好,所以文件是OK的。我已经尝试了各种ClassLoader变体,包括getSystemClassLoader(),getCl

  • 问题内容: 为什么第一个返回,而第二个返回? 这不是很奇怪吗?如果不是,此行为背后的逻辑是什么? 下划线是罪魁祸首吗?为什么? 问题答案: 如@hsz的评论中所述,这是已知的bug。 但是,让我们调试并查看类的源代码。问题出在方法内部: : 第一个URI解析失败 这是因为符号未扫描块内foreseed,它只允许阿尔法,数字和符号(,,和)。 是的,这尚未在中解决。