简体   繁体   中英

Spring form validation on dependent object

I faced this problem while I was validating my forms, For single entities it worked fine. But when I try to validate a object with nested objects I get this error.

HTTP Status 500 - Request processing failed; nested exception is javax.validation.ConstraintViolationException: Validation failed for classes [com.poultry.jp.model.PaymentRequest] during persist time for groups [javax.validation.groups.Default, ]

Following is my controller

 @RequestMapping(value =  {"user/addMedicineOrder","admin/addMedicineOrder"}, method = RequestMethod.GET)
public String addMedicineOrderGET(@ModelAttribute("medicineOrder") MedicineOrder medicineOrder,Model model) {

    List<SupplierReport> supplierReport = supplierService.getSupplierNames();
    List<MedicineOrderReport> medicineOrderReport = medicineOrderService.getMedicineOrderDetails();
    List<PaymentRequestReport> paymentRequestReport = paymentRequestSerivice.getPaymentRequestDates();
    List<MedicineReport> medicineReport = medicineService.getMedicineDetails();

    model.addAttribute("medicineOrderReport",medicineOrderReport);
    model.addAttribute("supplierReport", supplierReport);
    model.addAttribute("paymentRequestReport", paymentRequestReport);
    model.addAttribute("medicineReport", medicineReport);

    return "addMedicineOrder";
}

@RequestMapping(value = {"user/addMedicineOrder","admin/addMedicineOrder"}, method = RequestMethod.POST)
public String addMedicineOrderPOST(@Valid @ModelAttribute("medicineOrder") MedicineOrder medicineOrder,BindingResult result) {


    if (result.hasErrors()) {
        return "addMedicineOrder";
    } else {

        medicineOrderService.save(medicineOrder);


        return "redirect:addMedicineOrder.html";
    }
}

Following is my Medicine Order Model

 public class MedicineOrder {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long medicineOrderId;

@OneToMany(mappedBy = "medicineOrder", cascade = CascadeType.ALL,fetch = FetchType.EAGER,orphanRemoval=true)
private List<MedicineOrderDetails> medicineOrderDetails = new ArrayList<MedicineOrderDetails>();

@ManyToOne
private Supplier supplier;

@DateTimeFormat(pattern = "yyyy-MM-dd")
@Temporal(TemporalType.DATE)
private Date date;

private double total;

private double discount;
private boolean inStock;

@OneToOne(cascade={CascadeType.MERGE , CascadeType.PERSIST})
@JoinColumn(name="paymentRequest_id")
private PaymentRequest paymentRequest;

private boolean isDeleted;
private Date created;
private Date updated;
// Getters and Setters
}

Following is the dependent class Payment Request public class PaymentRequest{

public static final String FIND_PAYMENT_REQUEST_DATES = "findPaymentReequestDates";
public static final String FIND_PAYMENT_REQUEST_BY_ID = "findPaymentReequestById";
public static final String FIND_PAYMENT_REQUEST_REPORT = "findPaymentRequestReport";


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long paymentId;
private double amount;
@Type(type = "text")
@NotEmpty
private String description;
private String chequeID;
private String status;

@DateTimeFormat(pattern = "yyyy-MM-dd")
@Temporal(TemporalType.DATE)
private Date date;

private boolean isDeleted;
private boolean isPaid;

private Date created;
private Date updated;
//Getters and Setters
}

and Following is where I persist Medicine Order which persist the payment request with it.

@Repository("MedicineOrderRepository")

public class MedicineOrderRepositoryImp implements MedicineOrderRepository{

@PersistenceContext
private EntityManager entityManager;

public MedicineOrder save(MedicineOrder medicineOrder){

    for(MedicineOrderDetails order : medicineOrder.getMedicineOrderDetails())
    {
        order.setMedicineOrder(medicineOrder);
    }

    medicineOrder.getPaymentRequest().setStatus("Pending");
    entityManager.persist(medicineOrder);
    entityManager.flush();

    return medicineOrder;
}
}

And Finally following the jsp code.

<div class=".col-md-6">
        <form:form commandName="medicineOrder" class="form-horizontal"
            autocomplete="off">
            <form:errors path="*" Class="alert alert-danger" element="div" />

            <div class="form-group">
                <label for="inputDescription" class="col-sm-2 control-label">Description</label>
                <div class="col-sm-3">
                    <form:textarea path="paymentRequest.description" type="text"
                        class="form-control" id="inputDescription"
                        placeholder="Enter Short Description" rows="3" />
                </div>
            </div>

            <div class="form-group">
                <label for="inputAmount" class="col-sm-2 control-label">Amount</label>
                <div class="col-sm-3">
                    <form:input path="paymentRequest.amount" type="text"
                        class="form-control" id="inputAmount" placeholder="Enter Amount" />
                </div>
            </div>

            <div class="form-group">
                <label for="supplierId" class="col-sm-2 control-label">Supplier</label>
                <div class="col-sm-5">
                    <form:select path="supplier.supplierId" id="supplierId"
                        class="form-control">
                        <form:options items="${supplierReport}" itemLabel="name"
                            itemValue="supplierId" id="" />
                    </form:select>
                </div>
            </div>
            <div class="form-group">
                <label for="inputTotal" class="col-sm-2 control-label">Total</label>
                <div class="col-sm-5">
                    <form:input path="total" type="text" class="form-control"
                        id="inputTotal" name="inputTotal" />
                </div>
            </div>
            <div class="form-group">
                <label for="inputDiscount" class="col-sm-2 control-label">Discount
                </label>
                <div class="col-sm-5">
                    <form:input path="discount" type="text" class="form-control"
                        id="inputDiscount" />
                </div>
            </div>

            <input type="submit" value="Save Medicine Order"
                class="btn btn-primary">

        </form:form>
    </div>

I was able to resolve this. Credit goes to this forum, http://forum.spring.io/forum/spring-projects/web/87783-jsr-303-validation-on-child-objects

what I had to do was just add @Valid annotation in my parent class's child object EX:

@Valid private PaymentRequest paymentRequest;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM