0

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

这是一些代码,在 .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);

玻璃鱼回归

    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;
}

}

你知道现在出了什么问题吗?

4

1 回答 1

0

在初始化表单时,您需要在模型中添加一个PriceIncrease带有名称的类型属性。priceIncrease

@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";

  }
}
于 2012-12-02T00:17:18.583 回答