2015-03-03 52 views
2

我正在使用spring 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; 

} 

我的验证器类是

示值误差10
+0

上ErrorsTag设置断点(其方式和方法从基类继承。)可能有助于 – 2015-03-03 08:57:13

+0

@JohnDonn :你能告诉我如何设置断点,控制器出现错误,如果你正在使用Eclipse,我已经在控制台 – 2015-03-03 08:58:50

+0

中打印它们,你应该按下Ctrl + Shift + T并键入类的名称ErrorsTag;如果你有源,你会看到类源打开。如果没有,你必须找到你的spring-mvc jar,并将它与你从网上下载的源代码联系起来。只要源代码打开,您可以按照与自己的代码完全相同的方式设置断点。 – 2015-03-03 09:02:39

回答

1

问题是,通过添加模型属性您正在从模型中删除绑定错误。

绑定错误绑定到验证的实例。如果您在方法内的第一行设置了断点并检查模型,您将看到一个带有密钥Campaign的验证对象,但也会看到一个带有密钥的绑定错误对象org.springframework.validation.BindingResult.Campaign

当您进一步移动并达到在'Campaign'键下添加一个新实例到模型中,注意绑定错误将从模型中移除,因为它们绑定的实例不再存在,这就是为什么你不'不要在你的JSP中看到它们。

删除或更改密钥,你应该看到你的绑定错误。

而且并不是说你不需要手动调用validator.validate(campaignObj, result);@Valid将调用验证你