2017-12-29 21 views
0

私は、次のエンティティが、私はJPAの春のプロジェクトはJPA春に必要な型「java.lang.Integerの」に「はjava.lang.String型」タイプの値を変換するのに失敗しました

public class Product implements DomainObject{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @Version 
    private Integer version; 
    private String description; 
    private BigDecimal price; 
    private String imageUrl; 

    public Product() { 
    } 
// getters and setters 
} 

にH2を通じて持続していこの

<form class="form-horizontal" th:object="${product}" 
      th:action="@{/product}" method="post"> 
     <input type="hidden" th:field="*{id}"/> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Description:</label> 
      <div class="col-sm-10"> 
       <input type="text" class="form-control" th:field="*{description}"/> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Price:</label> 
      <div class="col-sm-10"> 
       <input type="text" class="form-control" th:field="*{price}"/> 
      </div> 
     </div> 
     <div class="form-group"> 
      <label class="col-sm-2 control-label">Image Url:</label> 
      <div class="col-sm-10"> 
       <input type="text" class="form-control" th:field="*{imageUrl}"/> 
      </div> 
     </div> 
     <div class="row"> 
      <button type="submit" class="btn btn-default">Submit</button> 
     </div> 
    </form> 

このように新しいデータを入力するフォームをHTMLページを持っていることは、コントローラからの投稿を取り扱うだ方法である

@PostMapping("/product") 
public String saveOrUpdateProduct(Product product){ 
    productService.saveOrUpdate(product); 
    return "redirect:/product/"+product.getId(); 
} 

そして、これは私がフォームをHTMLページに移動し、私は失敗しました

を持って提出しようとすると、データベース

private EntityManagerFactory emf; 

@PersistenceUnit 
public void setEmf(EntityManagerFactory emf) { 
    this.emf = emf; 
} 

@Override 
public Product saveOrUpdate(Product domainObject) { 
    EntityManager em = emf.createEntityManager(); 
    em.getTransaction().begin(); 
    Product savedProduct = em.merge(domainObject); 
    em.getTransaction().commit(); 
    return savedProduct; 
} 

との相互作用を扱うautowiredサービスクラスでするsaveOrUpdateメソッドであります型 'java.lang.String'の値を必須型 'java.lang.Integer'に変換します。 ネストされた例外はjava.lang.NumberFormatExceptionです:入力文字列の場合: "ヌル"

+0

あなたはこれが新しいデータ用だと言っていますが、正しいですか?もしそうなら、*なぜ*あなたは 'id'の隠された入力を持っていますか? – Powerlord

+0

@Powerlordは保存または更新を望んでいるので、 – Ele

+0

この入力には正確に何が入力されますか: ''私は、 'id'がコントローラからテンプレートに渡されるときにnullになると思われます。 – tsolakp

答えて

0

おそらくあなたは、コントローラでのparam製品に注釈を付けることがあります。@RequestBodyため

@PostMapping("/product") 
public String saveOrUpdateProduct(@RequestBody Product product) 

春のJavadoc

@Target(value=PARAMETER) 
@Retention(value=RUNTIME) 
@Documented 
public @interface RequestBody 

/*Annotation indicating a method parameter should be bound to the body of the 
    web request. The body of the request is passed through an 
    HttpMessageConverter to resolve the method argument depending on the 
    content type of the request.*/ 

は、この情報がお役に立てば幸い!

+0

私はこの注釈を追加する場合このエラーがあります**予期しないエラーが発生しました(タイプ=サポートされていないメディアタイプ、ステータス= 415)。 'application/x-www-form-urlencoded; charset = UTF-8'のコンテンツタイプはサポートされていません** – MrSir

+0

フォームで文字セットを設定しようとしてください '

' – Ele

+0

私は同じエラーがあります – MrSir

0

問題は、私は、元の未マージされた製品からproduct.getId()を呼び出すために使用さ

@PostMapping("/product") 
public String saveOrUpdateProduct(Product product){ 
    productService.saveOrUpdate(product); 
    return "redirect:/product/"+product.getId(); 
} 

としなければならなかった、それはまだIDを持っていなかった、私は、保存された製品

を返す、それを解決しました
@PostMapping("/product") 
public String saveOrUpdateProduct(Product product){ 
    Product savedProduct = productService.saveOrUpdate(product); 
    return "redirect:/product/"+savedProduct.getId(); 
} 
関連する問題