如何根据需要标记Spring MVC参数

如何根据需要标记Spring MVC参数,spring,spring-mvc,spring-validator,Spring,Spring Mvc,Spring Validator,我在spring控制器中有这样的方法 @RequestMapping(value = "/updateArticle", method = RequestMethod.POST) @ResponseBody public void updateArticle(Long id, String name, String description) { ... } @RequestMapping(value = "/updateArticle", method = RequestMethod.P

我在spring控制器中有这样的方法

@RequestMapping(value = "/updateArticle", method = RequestMethod.POST)
@ResponseBody
public void updateArticle(Long id,  String name, String description) {
  ...
}
@RequestMapping(value = "/updateArticle", method = RequestMethod.POST)
@ResponseBody
public void updateArticle(@RequestParam(value="id",required=true) long id,@RequestParam(value="name",required=true)  String name, @RequestParam(value="description",required=true) String description) {
  ...
}
我希望需要id和名称。换句话说,如果它们是空值,则必须抛出异常

我该怎么做?这个或类似的东西有注释吗


谢谢

我想您正在将表单传递给此控制器。因此,将所有表单字段转换为一个表单对象,然后可以对它们使用Java验证。例如,您在表单中有id、name和description字段:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class ArticleForm {

    @NotNull
    private Long id;

    @Size(min = 2, max = 20)
    private String name;

    @Size(min =2, max =20)
    private String description;

    // getters and setters
}
然后,在控制器中:

 @RequestMapping(value = "/updateArticle", method = RequestMethod.POST)
 @ResponseBody
 public void updateArticle(@Valid ArticleForm articleForm) {
      // do something with the article form object using getters and this retrieves
      // values sent in the HTTP Form
 }

是的,有
@RequestParam(required=true)
请参阅

默认情况下,Required标志甚至为true,因此您只需执行以下操作:

@RequestMapping(value = "/updateArticle", method = RequestMethod.POST)
@ResponseBody
public void updateArticle(@RequestParam Long id, @RequestParam String name, @RequestParam String description) {
  ...
}

您必须在控制器中添加带有所需true注释的RequestParam

@RequestMapping(value = "/updateArticle", method = RequestMethod.POST)
@ResponseBody
public void updateArticle(Long id,  String name, String description) {
  ...
}
@RequestMapping(value = "/updateArticle", method = RequestMethod.POST)
@ResponseBody
public void updateArticle(@RequestParam(value="id",required=true) long id,@RequestParam(value="name",required=true)  String name, @RequestParam(value="description",required=true) String description) {
  ...
}
当您从浏览器点击此控制器URL时,如果其中一个参数为mission,则您将在浏览器上收到
错误语法错误

@RequestMapping (value = "/gethomeworkinfo.json", method = {RequestMethod.GET, RequestMethod.POST}, produces = "application/json")
public @ResponseBody
HomeworkReport getHomeworkReportInfo(@RequestParam (value = "schoolid", required = false) String schoolId, @RequestParam (value = "homeworkid") String homeworkId,
        @RequestParam (value = "startdate", required = false, defaultValue = "2014-06-01") @DateTimeFormat (pattern = "yyyy-MM-dd") Date startdate,
        @RequestParam (value = "enddate", required = false, defaultValue = "2014-12-30") @DateTimeFormat (pattern = "yyyy-MM-dd") Date enddate,
        @RequestParam (value = "userid", required = false) String userId, HttpServletRequest request) {

    // some actions
}


我目前使用这种方法。它会帮助你的

虽然正确的方法不是OP想要的。它不抛出异常,而是收集约束冲突information@grid实际上不是,如果用户没有在表单中输入名称,将引发异常。此外,如果这是正确的方法,那么这不应该是模式吗?它是良好实践和设计的一部分。这取决于您如何使用JSR303API,或者它如何与您的框架集成。当与SpringMVC集成时,您无一例外地会跳出一个AIK。当与Jpa一起使用时,它会这样做。这个问题要求对请求参数进行验证,尽管您的回答似乎更能正确地解决用例问题,并且忘记了例外情况。这是怎么回事?例如,使用此url获取“?name=”我的意思是,当我们在方法中有参数时,而不是在POJO中。我可以验证不为null吗?或者不是空白?您无法将null作为请求参数传递。比如说,
?name=
将导致为name分配空字符串。对于更复杂的验证,您需要使用@blackpanther plus的响应,可能需要实现一个定制的javax.validation.ConstraintValidator(一些spring文档),再次感谢您。Spring为此提供了org.springframework.validation.Validator。这很好,但我必须用参数创建一个新类,我不喜欢这种编码风格。这就是全部。我不想为参数创建新类……请注意,这是处理post请求的更标准的方法—将表单映射到POJO。当使用这种方法时,您将获得更大的能力,并且在更新的实体具有更多属性的情况下,代码的可读性将更高。您还可以将url编码的表单切换为JSON或XML,而无需涉及您的实现——只需重新配置MVC即可。如果我们有许多参数,POJO中的POST和GET会更好。我同意。但当我有一个或两个参数时,如果我们在spring中编写参数时也有更灵活的验证功能,那就更好了。如果我们用POJO编写,spring会有非常好的验证。