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 无法插入包含重音的字符串的行的主要内容,如果未能解决你的问题,请参考以下文章
JPA/Hibernate 在 Spring Boot 应用程序中插入不存在的表
如何忽略 Spring JPA findBy 存储库中的重音符号?
Groovy 和 JPA 阻止 Spring Boot CrudRepository 进行插入