Сообщения об ошибках JSP не отображаются при использовании Spring Data JPA - PullRequest
0 голосов
/ 16 мая 2018

Это мой репозиторий:

@Repository
public interface ProductRepo extends CrudRepository<Product,Integer> {

public List<Product> findAll();
public Product findById(int id);

}

My Entity Bean:

@Entity
@Table(name = "product")
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "product_id")
private Integer id;

@NotEmpty
@Column(name = "product_name")
private String productName;

Контроллер:

@PostMapping("/add-product")
String addProduct(@Validated @ModelAttribute("product")Product product, BindingResult bindingResult){


    if (bindingResult.hasErrors()) {
        System.out.println("has errors: " + bindingResult.toString());
    }

    System.out.println( "adding Product ..." );

    productService.save(product);

    return "redirect:/products/success";

Этомой взгляд

<form:form action="add-product" method="post" modelAttribute="product">
    <label for="productName">Product Name</label>
    <form:input path="productName" id="productName" type="text" placeholder="Add product name"/>
    <form:errors path="productName" />
...

Он просто отлично работает при использовании Hibernate SessionFactory для хранения в базе данных, например:

// A shorter way to save customer
    Session currentSession = sessionFactory.getCurrentSession();
    currentSession.saveOrUpdate(customer);

, но при замене его на Spring Data JPA он начинает выдавать исключения ивозвращать 500 html-страниц вместо простого отображения поля ошибки, как это было раньше.

Выдается 4 исключения:

javax.validation.ConstraintViolationException: Validation failed for classes [com.luv2code.springdemo.entity.Product] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='must not be empty', propertyPath=productName, rootBeanClass=class com.luv2code.springdemo.entity.Product, messageTemplate='{javax.validation.constraints.NotEmpty.message}'}
]


javax.persistence.RollbackException: Error while committing the transaction
    org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:77)
    org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:71)
    org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:536)



org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction

Ранее, без использования JPA, сообщение об ошибке проверки показывалось впредставление <form:errors />, не выбрасываемое как исключение с кодом ошибки 500 http.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 17 мая 2018

Поведение, которое вы видите, не имеет ничего общего с Spring Data JPA, но тот факт, что вы переключились с обычного режима гибернации (судя по фрагментам кода) на JPA.

При использовании JPA и JSR-303 они будут работать вместе, чтобы предотвратить ввод недопустимых объектов в базу данных путем генерирования исключения проверки. При использовании простого Hibernate этого не происходит (по крайней мере исключения не распространяются).

Что произошло из-за того, что вы написали свой метод обработки запроса. В случае ошибок в модели вы просто делаете System.out и счастливо продолжаете метод, вместо этого вы должны вернуться к исходному виду (я предполагаю products/add-product).

@PostMapping("/add-product")
String addProduct(@Validated @ModelAttribute("product")Product product, BindingResult bindingResult){


    if (bindingResult.hasErrors()) {
        System.out.println("has errors: " + bindingResult.toString());
        return "products/add-product";
    }

    System.out.println( "adding Product ..." );

    productService.save(product);

    return "redirect:/products/success";

}

По сути, вам не удалось правильно обработать случай ошибок, приводящих к возникновению исключений из-за совместной работы JPA и javax.validation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...