重复的结果休息服务春季启动

Posted

技术标签:

【中文标题】重复的结果休息服务春季启动【英文标题】:Duplicated Result Rest Service Spring boot 【发布时间】:2016-07-25 06:30:36 【问题描述】:

大家好,我有一个 spring boot rest api,每个键和值都有重复的结果,如下面的代码

这是我的对象


id: 2,
Nom: "ee",
Prenom: "az",
Profil: "RC",
Pseudo: "aze",
Password: null,
role: null,
password: null,
nom: "ee",
prenom: "az",
profil: "RC",
pseudo: "aze"
,

id: 3,
Nom: "xx",
Prenom: "xxx",
Profil: "dataa",
Pseudo: "data",
Password: null,
role: null,
password: null,
nom: "xx",
prenom: "xxx",
profil: "dataa",
pseudo: "data"
,

如你所见,每一列都用大写重复第一个字母其他全部小写

这是我的课:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;




@Entity
@Table(name="\"UTILISATEUR\"")
public class Utilisateur   


@Id
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="\"IdUtilisateur\"")
public Long id ;
@Column(name="\"Nom\"")
public String Nom ; 
@Column(name="\"Prenom\"")
public String Prenom ; 
@Column(name="\"Profil\"")
public String Profil ; 
@Column(name="\"Pseudo\"")
public String Pseudo ; 
@Column(name="\"Password\"")
public String Password ;
@ManyToOne
@JoinColumn(name="\"id_role\"")
public Role role ;
public Long getId() 
    return id;

public void setId(Long id) 
    this.id = id;

public String getNom() 
    return Nom;

public void setNom(String nom) 
    Nom = nom;

public String getPrenom() 
    return Prenom;

public void setPrenom(String prenom) 
    Prenom = prenom;

public String getProfil() 
    return Profil;

public void setProfil(String profil) 
    Profil = profil;

public String getPseudo() 
    return Pseudo;

public void setPseudo(String pseudo) 
    Pseudo = pseudo;



public String getPassword() 
    return Password;

public void setPassword(String password) 
    Password = password;

public Role getRole() 
    return role;

public void setRole(Role role) 
    this.role = role;

public Utilisateur(String nom, String prenom, String profil, String pseudo, String password,
        Role role) 
    super();
    Nom = nom;
    Prenom = prenom;
    Profil = profil;
    Pseudo = pseudo;

    Password = password;
    this.role = role;

public Utilisateur() 
    super();

我正在使用我数据库中的 postgres,这是我的代码

CREATE TABLE "UTILISATEUR"
(
"IdUtilisateur" serial NOT NULL,
"Nom" character varying(50),
"Prenom" character varying(50),
"Profil" character varying(50),
"Pseudo" character varying(20),
"IdSite" integer DEFAULT 0,
"Password" character varying(1024),
id_role integer,
 )

最后这是我的 application.propreties

spring.datasource.url = jdbc:postgresql://localhost/baseecu
spring.datasource.username = postgres
spring.datasource.password =root


spring.datasource.driverClassName=org.postgresql.Driver
spring.jpa.database = mysql 
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto= update
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.EJB3NamingStrategy

我认为这可能是 jdbc 问题,因为我使用的是 postgres 9.2 而 jdbc 适用于 9.1 我在 JPA Uppercase table names 之前遇到了方言问题,在那之后我试图让它工作,现在我明白了

任何帮助或指导将不胜感激

【问题讨论】:

因为你有public 字段和getter/setter...字段应该是private @M.Deinum 如果您有时间只是一个问题,为什么当您在小写列中映射时它不会复制结果 因为属性foo 是由getter getFoo 确定的。当您有一个字段 Foo 时,您将有一个属性 foo 和字段 Foo 并且因为它是公开的,所以它是公开的。 【参考方案1】:

将实体类中的字段声明部分替换为以下代码:

...
@Id
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name="\"IdUtilisateur\"")
private Long id;
@Column(name="\"Nom\"")
private String Nom; 
@Column(name="\"Prenom\"")
private String Prenom; 
@Column(name="\"Profil\"")
private String Profil; 
@Column(name="\"Pseudo\"")
private String Pseudo; 
@Column(name="\"Password\"")
private String Password;
@ManyToOne
@JoinColumn(name="\"id_role\"")
private Role role;
...

【讨论】:

【参考方案2】:

进行如下修改,使Entity类遵循POJO类规则: 1. 将公共变量设为私有变量,例如更改 public String Nom ;private String Nom; 1.更改方法实现如下。改变

public void setNom(String nom) 
Nom = nom;

public void setNom(String nom) 
this.Nom = nom;

【讨论】:

【参考方案3】:

我建议您为变量和方法遵循正确的 java bean 标准命名约定。

保持成员变量私有。

JSON 序列化程序适用于公开的字段和 getter 方法。由于您已将成员变量命名为以大写字母开头,并且还有遵循标准 java 命名约定的相同的 getter。因此,Json 序列化程序将它们检测为要序列化的两个不同属性。

【讨论】:

【参考方案4】:

为避免此类错误,您还可以在 pom.xml 中使用 lombok 依赖,如下所示:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.14</version>
    </dependency>

你的实体类如下:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name="\"UTILISATEUR\"")
public class Utilisateur   


    @Id
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="\"IdUtilisateur\"")
    public Long id ;
    @Column(name="\"Nom\"")
    public String Nom ; 
    @Column(name="\"Prenom\"")
    public String Prenom ; 
    @Column(name="\"Profil\"")
    public String Profil ; 
    @Column(name="\"Pseudo\"")
    public String Pseudo ; 
    @Column(name="\"Password\"")
    public String Password ;
    @ManyToOne
    @JoinColumn(name="\"id_role\"")
    public Role role ;

这里,

    @Data 将创建所有的 getter 和 setter。

    @NoArgsConstructor 将创建一个无参数构造函数。

    @AllArgsConstructor 将创建一个全参数构造函数。

因此,您的代码会更简洁,更不容易出错。

【讨论】:

以上是关于重复的结果休息服务春季启动的主要内容,如果未能解决你的问题,请参考以下文章

春季启动数据休息中的日期问题

SSLHandshakeException:春季集成TCP服务器中没有共同的密码套件[重复]

春季休息服务拒绝http 403访问

休息与肥皂有啥区别[重复]

独立休息服务的Spring Boot安全性[重复]

传递 POST 请求。春季安全。休息模板。杰克逊转换器