Spring Boot jpa 无法插入包含重音的字符串的行

Posted

技术标签:

【中文标题】Spring Boot jpa 无法插入包含重音的字符串的行【英文标题】:Spring boot jpa can't insert row with string containing accents 【发布时间】:2018-12-31 20:52:56 【问题描述】:

我无法理解这个问题,因为我没有发现同样的问题。 我试图插入类型为“pièces détachées”的产品。在浏览器路径 /Produits 上,产品没有显示,但是当我从字符串中删除重音符号时,它会插入到 mysql 数据库中。我试图在数据库中插入重音,查询没问题。但是用我的代码是不可能做同样的事情的。这是我的 Produit 代码示例:

 //ajouter un produit
@PostMapping(value = "/Produits")
public ResponseEntity<Void> ajouterProduit(@RequestBody ProduitDTO produit) 
    Produit produitCK = new Produit();
    produitCK.setIdPM(new ProduitMagasin(produit.getId(), produit.getIdMagasin()));
    produitCK.setDateAjout(produit.getDateAjout());
    produitCK.setEtatProduit(produit.getEtatProduit());
    produitCK.setIdReference(produit.getIdReference());
    produitCK.setNumeroSerie(produit.getNumeroSerie());
    produitCK.setPrixVente(produit.getPrixVente());
    produitCK.setTVA(produit.getTVA());
    produitCK.setType(produit.getType());
    Produit produitAdded =  produitDao.save(produitCK);
    if (produitAdded == null)
        return ResponseEntity.noContent().build();
    else
        return new ResponseEntity<>(HttpStatus.CREATED);

产品DTO:

package com.stationphone.db.model;

import java.sql.Timestamp;

    /**
     *
     * @author Administrateur
 */
public class ProduitDTO 
     private int id;

    public enum Type 
        PIECES 
          public String getString() 
              return "pièces detachées";
          
         ,    
         VENTE 
      public String getString() 
          return "vente en magasin";
      
    ;

    public abstract String getString();


private String type;

private int id_reference;

private String numero_serie;

private Timestamp date_ajout;

private String marque;

private String modele;

private float prix_vente;
private double prixHT;
private float tva;

private String etat_produit;
private int id_magasin;

public int getId()
   return this.id;


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


public int getIdOnline()
   return this.id;


public void setIdOnline(int id)
    this.id=id;


public String getType()
    return this.type;


public void setType(String type)
    this.type=type;


public int getIdReference()
    return this.id_reference;


public void setIdReference(int id_reference)
    this.id_reference=id_reference;


public String getNumeroSerie()
    return this.numero_serie;


public void setNumeroSerie(String numero_serie)
    this.numero_serie=numero_serie;


public Timestamp getDateAjout()
    return this.date_ajout;


public void setDateAjout(Timestamp date_ajout)
    this.date_ajout=date_ajout;


public String getMarque()
    return this.marque;


public void setMarque(String marque)
    this.marque=marque;


public String getModele()
    return this.modele;


public void setModele(String modele)
    this.modele=modele;


public float getPrixVente()
    return this.prix_vente;


public void setPrixVente(float prix)
    this.prix_vente=prix;


public double getPrixHT()
    return this.prixHT;


public void setPrixHT(double prix)
    this.prixHT=prix;


public float getTVA()
    return this.tva;


public void setTVA(float tva)
    this.tva=tva;


public String getEtatProduit()
    return this.etat_produit;


public void setEtatProduit(String etat)
    this.etat_produit=etat;


public int getIdMagasin()
    return this.id_magasin;


public void setIdMagasin(int id_magasin)
    this.id_magasin=id_magasin;

类产品:

    package com.stationphone.db.model;

import java.io.Serializable;
import java.sql.Timestamp;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;

/**
 *
 * @author Administrateur
 */
@Entity
public class Produit implements Serializable 

    @EmbeddedId 
    private ProduitMagasin idPM;

    @OneToOne
@JoinColumn(name = "id_magasin", insertable=false, updatable=false)
Magasin magasin;

public enum Type 
    PIECES 
      public String getString() 
          return "pièces detachées";
      
     ,    
     VENTE 
      public String getString() 
          return "vente en magasin";
      
    ;

    public abstract String getString();


private String type;

private int id_reference;

private String numero_serie;

private Timestamp date_ajout;

private float prix_vente;
private float tva;

private String etat_produit;

public ProduitMagasin getIdPM()
   return this.idPM;


public void setIdPM(ProduitMagasin id)
    this.idPM=id;


public String getType()
    return this.type;


public void setType(String type)
    this.type=type;


public int getIdReference()
    return this.id_reference;


public void setIdReference(int id_reference)
    this.id_reference=id_reference;


public String getNumeroSerie()
    return this.numero_serie;


public void setNumeroSerie(String numero_serie)
    this.numero_serie=numero_serie;


public Timestamp getDateAjout()
    return this.date_ajout;


public void setDateAjout(Timestamp date_ajout)
    this.date_ajout=date_ajout;



public float getPrixVente()
    return this.prix_vente;


public void setPrixVente(float prix)
    this.prix_vente=prix;



public float getTVA()
    return this.tva;


public void setTVA(float tva)
    this.tva=tva;


public String getEtatProduit()
    return this.etat_produit;


public void setEtatProduit(String etat)
    this.etat_produit=etat;

我希望我能在这里找到答案。谢谢。

编辑:发布方法:

public static HttpResponse post(Object object, String type)
    HttpResponse response=null;
    try
    CloseableHttpClient client = HttpClientBuilder.create().build();  
    HttpPost postRequest = new HttpPost(getUrl(type));
    System.out.println(getUrl(type));
    ObjectMapper mapper= new ObjectMapper();
    String jsonInString = mapper.writeValueAsString(object);
    System.out.println(jsonInString);
    StringEntity input = new StringEntity(jsonInString);
    input.setContentType("application/json");
    postRequest.setEntity(input);

    response = client.execute(postRequest);

    if (response.getStatusLine().getStatusCode() != 201) 
        throw new RuntimeException("Failed : HTTP error code : "
            + response.getStatusLine().getStatusCode());

    

    BufferedReader br = new BufferedReader(
                    new InputStreamReader((response.getEntity().getContent())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) 
        System.out.println(output);
    
            System.out.println(response.getStatusLine().getStatusCode()+" ");

            client.close();
       catch (ClientProtocolException e) 

    e.printStackTrace();

   catch (IOException e) 

    e.printStackTrace();
   finally
        return response;
      

编辑 2:tomcat 本地错误:

018-07-24 18:55:32.196 WARN 10860 --- [nio-8084-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver:无法读取 HTTP 消息:

org.springframework.http.converter.HttpMessageNotReadableException: JSON 解析错误:无效的 UTF-8 中间字节 0x63

在 [Source: (PushbackInputStream);行:1,列:21];嵌套的 例外是 com.fasterxml.jackson.databind.JsonMappingException: 无效的 UTF-8 中间字节 0x63

在 [Source: (PushbackInputStream);行:1,列:21]

在 [Source: (PushbackInputStream);行:1,列:16](通过 参考

链:com.stationphone.db.model.ProduitDTO["type"])

【问题讨论】:

我想知道当你有口音打电话给persist 时你会得到什么例外......而不告诉别人你不给他们回答的机会 我没有看到任何异常,http 响应是 201(已创建)。 我只是注意到当它与 201 不同时有重音时它根本不会打印 http 响应它会引发异常但它不显示任何内容。通常它应该显示代码 201 或执行。 任何“不起作用”的东西都会报错……要么从调用中返回,要么在日志中。没有这些基本信息就没什么好说的了 我忘记了 Web 服务是服务器端的,我认为我所做的修改是可以的,我将在本地测试程序 【参考方案1】:

感谢比利弗罗斯特该怎么做两件事:

HttpPost postRequest = new HttpPost(getUrl(type));
        postRequest.setHeader("Content-Type", "application/json;charset=UTF-8");
StringEntity input = new StringEntity(jsonInString, "UTF-8");

【讨论】:

以上是关于Spring Boot jpa 无法插入包含重音的字符串的行的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot JPA 批量插入

JPA/Hibernate 在 Spring Boot 应用程序中插入不存在的表

如何忽略 Spring JPA findBy 存储库中的重音符号?

Groovy 和 JPA 阻止 Spring Boot CrudRepository 进行插入

使用 Spring Boot 和 Spring Data JPA 批量插入不起作用

使用 Spring Boot JPA 在数据库中插入多行