繁体   English   中英

为什么 spring 引导返回给我一个 json 和 null 的某些值?

[英]why is spring boot returning me a json with null for some values?

我正在制作一个练习游戏。

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

应用程序属性

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 带有错误的 null 值

返回带有错误空值的 json

这是 model

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

这是我的 controller 调用服务

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

粗鲁的界面

public interface RiddlesRepository extends CrudRepository<Riddle, Integer> {

}

最后是控制台 output 如果有帮助的话

痕迹

我尝试了同样的事情,得到了类似的结果。 正如您所说,它发生在修改 spring.jpa.hibernate.ddl-auto 以进行更新时。 它最终添加了 2 个新列。

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

原来的列名是 riddleDescription 和 riddlerName 并且那些保留了现有的值。 但是新列中不会有数据。 因此,假设我重新创建了您遇到的相同问题,那么您必须

  • 在数据库中:将数据从旧列(不带下划线)移动到新列(带下划线)并删除旧列。 或者
  • 在数据库中:删除新列(带下划线)。 在 Riddle.java 将属性riddlerNameriddleDescription更改为riddlernameriddledescription

我假设您可能在某些时候也更改了这些属性名称的所有小写和驼峰式。 因为驼峰属性会将 map 到数据库中作为下划线(例如 code - riddleName -> db column - riddle_name),而所有小写字母都不会有下划线(例如 code - riddlername -> db column - riddlerName 或 riddlername)。

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

要覆盖默认行为,您可以使用

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

@Column(name = "riddleDescription")
private String riddleDescription;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM