2015-03-03 2 views
2

Я создаю проект с использованием пружинного MVC. Я проверяю поля, используя jsr303. Он отлично работает. Показывает ошибки полей в консоли, но не на странице jsp. Может ли кто-нибудь сообщить мне, что я здесь делаю неправильно?jsp не показывает ошибки весеннего валидатора

Мой метод контроллер

@RequestMapping(value="/addCampaign", method = RequestMethod.POST) 
    public String processForm(@ModelAttribute(value="Campaign") @Valid CampaignEntity campaignObj,BindingResult result, ModelMap model, Principal principal) { 

     validator.validate(campaignObj, result); 

     if(result.hasErrors()){   

      System.out.println(result.getErrorCount()); 
      System.out.println(result.toString()); 

      CampaignEntity campaignBean = new CampaignEntity(); 

      Map<String,String> agencies = new LinkedHashMap<String,String>(); 
      agencies.put("1", "United Stated"); 
      agencies.put("2", "China"); 
      agencies.put("3", "Singapore"); 
      agencies.put("4", "Malaysia"); 

      model.addAttribute("agencies", agencies); 
      model.addAttribute("publishers", agencies); 
      model.addAttribute("Campaign", campaignBean); 

      return "addCampaign"; 
     }else{ 
      return campaign(model, principal); 
     } 
    } 

В JSP Я показываю ошибку, используя тег

<form:errors path="*" cssClass="error" /> 

мой класс сущность

package com.nativeunlock.dto; 

import java.io.Serializable; 
import java.util.Date; 

import javax.persistence.*; 
import javax.validation.constraints.Digits; 
import javax.validation.constraints.NotNull; 

import org.hibernate.validator.constraints.NotEmpty; 

import lombok.Data; 
import lombok.Getter; 
import lombok.Setter; 


@SuppressWarnings("serial") 
@NamedQueries({ 
    @NamedQuery(
      name = CampaignEntity.GET_CAMPAIGNS_QUERY, 
      query = "from CampaignEntity campaign" 
    ), 
    @NamedQuery(
      name = CampaignEntity.DELETE_CAMPAIGNS_QUERY, 
      query = "DELETE FROM CampaignEntity campaign WHERE campaign.campaign_id = :campaign_id" 
    )  
}) 

@Entity 
@Table(name = "campaign") 
public class CampaignEntity implements Serializable { 

    public static final String GET_CAMPAIGNS_QUERY ="getCampaignList"; 
    public static final String DELETE_CAMPAIGNS_QUERY ="deleteCampaignList"; 

    @Id 
    @Getter 
    @Setter 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "campaign_id", unique = true, nullable = false) 
    private int campaign_id; 

    @Getter 
    @Setter 
    @Column(name = "name", unique = true) 
    @NotEmpty(message="Name field is mandatory.") 
    private String name; 


    @Getter 
    @Setter 
    @Column(name = "no_of_views") 
    @NotNull(message="No. of Views field is mandatory.") 
    private int no_of_views; 

    @Getter 
    @Setter 
    @Column(name = "video_url") 
    @NotEmpty(message="Video URL field is mandatory.") 
    private String video_url; 

    @Getter 
    @Setter 
    @Column(name = "start_date")  
    @NotEmpty(message="Start Date field is mandatory.") 
    private String start_date; 

    @Getter 
    @Setter 
    @Column(name = "end_date") 
    @NotEmpty(message="End Date field is mandatory.") 
    private String end_date; 

    @Getter 
    @Setter 
    @Column(name = "click_to_play") 
    @NotNull(message="Click to play field is mandatory.") 
    private int click_to_play; 

    @Getter 
    @Setter 
    @Column(name = "frequency") 
    @NotNull(message="Frequency field is mandatory.") 
    private int frequency; 

    @Getter 
    @Setter 
    @Column(name = "priority") 
    @Digits(fraction = 0, integer = 100) 
    @NotNull(message="Priority field is mandatory.") 
    private int priority; 

    @Getter 
    @Setter 
    @Column(name = "divice") 
    @NotNull(message="Divice field is mandatory.") 
    private int divice; 

    @Getter 
    @Setter 
    @Column(name = "operating_system") 
    @NotNull(message="Operating system field is mandatory.") 
    private int operating_system; 

    @Getter 
    @Setter 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "publisher_id") 
    @NotEmpty(message="Publisher field is mandatory.") 
    private PublisherEntity publishers; 

    @Getter 
    @Setter 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "agency_id") 
    @NotEmpty(message="Agency field is mandatory.") 
    private AgencyEntity agencies; 

} 

мой класс валидатор

package com.nativeunlock.Validator; 

import org.springframework.stereotype.Component; 
import org.springframework.validation.Errors; 
import org.springframework.validation.Validator; 

import com.nativeunlock.dto.CampaignEntity; 

@Component 
public class CampaignValidator implements Validator{ 

    @Override 
    public boolean supports(Class c) { 
     return CampaignEntity.class.isAssignableFrom(c); 
    } 

    @Override 
    public void validate(Object command, Errors errors) { 
     CampaignEntity campaignBean = (CampaignEntity)command; 
     /*if(!regBean.getPassword().equals(regBean.getRePassword())) 
      errors.rejectValue("rePassword","password.notmatch");*/ 
    } 

} 
+0

установив точку останова на ErrorsTag (его методы и методы, унаследованные от базовых классов) может помочь –

+0

@JohnDonn : Можете ли вы сообщить мне, как я могу установить точку останова, я получаю ошибки в контроллере, я печатаю их на консоли –

+0

, если вы работаете с Eclipse, вы должны нажать Ctrl + Shift + T и набрать имя класса ErrorsTag; если у вас есть источники, вы увидите, что источник класса открывается. Если нет, вы должны найти свой весенний mvc jar и связать с ним исходный код, который вы загружаете из Интернета. Как только источник откроется, вы можете установить точки останова точно так же, как это делается с помощью собственного кода. –

ответ

1

Проблема заключается в том, что добавив атрибут модели model.addAttribute("Campaign", campaignBean);, вы удаляете свои ошибки привязки из модели.

Ошибки привязки привязаны к проверяемому экземпляру. Если вы установите точку останова на первую строку внутри вашего метода и проведете проверку модели, вы увидите проверенный объект с ключом Campaign, но также объект ошибки привязки с ключом org.springframework.validation.BindingResult.Campaign

Когда вы двигаетесь дальше и достигаете где вы добавляете новый экземпляр модели под ключ «Кампания», обратите внимание, что ошибки привязки будут удалены из модели, так как экземпляр, с которым они связаны, больше не существует, и именно поэтому вы не знаете, т их видеть в вашем JSP.

Извлеките model.addAttribute("Campaign", campaignBean); или смените ключ, и вы увидите свои привязки.

Также не то, что вам не нужно вручную призывание validator.validate(campaignObj, result);@Valid будет вызывать проверку для вас

Смежные вопросы