2012-12-02 38 views
0

我试图从springsource.org编写一些基本示例,并将示例中的SimpleFormController替换为一些@Controller和@RequestMapping注释。但是,所有的应用程序运行时,我得到的是错误:java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'priceIncrease' available as request attribute在Spring v3.1中替换SimpleFormController

下面是一些代码,以.jsp我有这样的:

<form:form method="post" modelAttribute="priceIncrease"> 
<table width="95%" bgcolor="f8f8ff" border="0" cellspacing="0" cellpadding="5"> 
<tr> 
    <td align="right" width="20%">Increase (%):</td> 
    <td width="20%"> 
     <form:input path="percentage"/> 
    </td> 
    <td width="60%"> 
     <form:errors path="percentage" cssClass="error"/> 
    </td> 
</tr> 
</table> 
<br> 
<input type="submit" align="center" value="Execute"> 
</form:form> 

和控制器:

@Controller 
@RequestMapping("/priceincrease.htm") 
public class PriceIncreaseFormController { 

@Autowired 
PriceIncreaseValidator priceIncreaseValidator; 

protected final Log logger = LogFactory.getLog(getClass()); 

@RequestMapping(method= RequestMethod.POST) 
public String onSubmit(@ModelAttribute("priceIncrease")PriceIncrease priceIncrease, BindingResult result) throws ServletException { 

    int increase = priceIncrease.getPercentage(); 
    priceIncreaseValidator.validate(increase, result); 

    if (result.hasErrors()) { 
     return "priceIncrease"; 
    } 

    logger.info("Increasing prices by " + increase + "%."); 

    return "redirect:home.htm"; 
    } 

@RequestMapping(method=RequestMethod.GET) 
public String initializeForm(ModelMap model) { 
    Map<Integer, String> priority = new LinkedHashMap<Integer, String>(); 

    priority.put(1, "low"); 
    priority.put(2, "medium"); 
    priority.put(3, "high"); 

    model.addAttribute("priorityList", priority); 

    return "priceincrease"; 

    } 
} 

至于我知道,我不需要在servlet.xml中进行任何额外的配置,对吗?所以你知道男生出问题了吗?

@ kmb385 感谢您的帮助,现在表单正确初始化,但'onSubmit'和验证方法还有另一个问题。眼下代码如下所示:

@Autowired 
PriceIncreaseValidator priceIncreaseValidator; 

protected final Log logger = LogFactory.getLog(getClass()); 

@Autowired 
private ProductManager productManager; 

@RequestMapping(method= RequestMethod.POST) 
public String onSubmit(@ModelAttribute("priceIncrease")PriceIncrease priceIncrease, BindingResult result) throws ServletException { 

    int increase = priceIncrease.getPercentage(); 
    logger.info("Increasing prices by " + increase + "%."); 

    logger.info("result : " + result.toString()); 
    priceIncreaseValidator.validate(increase, result); 

    productManager.increasePrice(increase); 

    if (result.hasErrors()) { 
     return "priceIncrease"; 
    } 



    return "redirect:hello.htm"; 
} 

priceIncreaseValidator.validate(increase, result); 

GlassFish的回报

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException 

PriceIncreaseValidator:

public class PriceIncreaseValidator implements Validator { 

private int DEFAULT_MIN_PERCENTAGE = 0; 
private int DEFAULT_MAX_PERCENTAGE = 50; 
private int minPercentage = DEFAULT_MIN_PERCENTAGE; 
private int maxPercentage = DEFAULT_MAX_PERCENTAGE; 

@Override 
public boolean supports(Class clazz) { 
    return PriceIncrease.class.equals(clazz); 

} 

@Override 
public void validate(Object arg0, Errors arg1) { 
    PriceIncrease pi = (PriceIncrease) arg0; 

    if (pi == null) { 
     arg1.rejectValue("percentage", "error.not-specified", null, "cos wymagane"); 
    } 
    else { 
     if (pi.getPercentage() > maxPercentage) { 
      arg1.rejectValue("percentage", "error.too-high", new Object[] {new Integer(maxPercentage)}, "za duzo"); 
     } 
     if (pi.getPercentage() <= minPercentage) { 
      arg1.rejectValue("percentage", "error.too-low", new Object[] {new Integer(minPercentage)}, "za malo"); 
     } 
    } 

} 

public void setMinPercentage(int i) { 
    this.minPercentage = i; 
} 

public int getMinPercentage() { 
    return minPercentage; 
} 

public void setMaxPercentage(int i) { 
    this.maxPercentage = i; 
} 

public int getMaxPercentage() { 
    return maxPercentage; 
} 

}

你知道现在有什么错吗?

回答

0

初始化表单时,需要将名称为priceIncreasePriceIncrease类型属性添加到模型中。

@RequestMapping(method=RequestMethod.GET) 
public String initializeForm(ModelMap model) { 
    Map<Integer, String> priority = new LinkedHashMap<Integer, String>(); 
    priority.put(1, "low"); 
    priority.put(2, "medium"); 
    priority.put(3, "high"); 

    PriceIncrease priceIncrease = new PriceIncrease(); //Not sure of constructor 
    model.addAttribute("priceIncrease", priceIncrease); 

    model.addAttribute("priorityList", priority); 

    return "priceincrease"; 

    } 
} 
+0

难道这不适合你吗? –

相关问题