Java 如何在spring引导中有效使用@RequestHeader

Java 如何在spring引导中有效使用@RequestHeader,java,spring,rest,validation,spring-boot,Java,Spring,Rest,Validation,Spring Boot,如果缺少或格式错误,如何验证所需的标题 @RequestMapping(value = "/example/{id}", method = RequestMethod.PUT) public ResponseEntity<> update(@RequestHeader(value="last-modified-date") String lastModDate, HttpServletRequest request, @

如果缺少或格式错误,如何验证所需的标题

    @RequestMapping(value = "/example/{id}", method = RequestMethod.PUT)        
    public ResponseEntity<> update(@RequestHeader(value="last-modified-date") String lastModDate, HttpServletRequest request,
                @RequestBody ReBody rebody, @PathVariable("id") int id) throws Exception{
    // Stuff here...
    }

或者在格式错误时抛出异常

你已经回答了你的问题。您只需按以下方式操作即可:-

public ResponseEntity<> update(@RequestHeader(value="last-modified-date") String lastModDate, HttpServletRequest request,
            @RequestBody ReBody rebody, @PathVariable("id") int id) throws Exception{

         if (lastModDate == null) {
         throw Exception();
         }

         // Stuff here...

     }
public ResponseEntity更新(@RequestHeader(value=“last modified date”)字符串lastModDate,HttpServletRequest请求,
@RequestBody ReBody ReBody,@PathVariable(“id”)int id)引发异常{
if(lastModDate==null){
抛出异常();
}
//这里的东西。。。
}

只需添加
@Valid
注释即可

@RequestMapping(value = "/example/{id}", method = RequestMethod.PUT)        
public ResponseEntity<> update(@Valid @RequestHeader(value="last-modified-date") String lastModDate, HttpServletRequest request,
            @RequestBody ReBody rebody, @PathVariable("id") int id) throws Exception{
    // Stuff here...
}
@RequestMapping(value=“/example/{id}”,method=RequestMethod.PUT)
公共响应属性更新(@Valid@RequestHeader(value=“last modified date”)字符串lastModDate,HttpServletRequest请求,
@RequestBody ReBody ReBody,@PathVariable(“id”)int id)引发异常{
//这里的东西。。。
}

但是您仍然需要手动执行格式验证。或者将
lastModDate
类型从
String
更改为
Date
,或者将其转换为
timestamp

,您可以使用@Valid和@Pattern

@RequestMapping(value = "/example/{id}", method = RequestMethod.PUT)        
public ResponseEntity<> update(@RequestHeader(value="last-modified-date", required = true) @Pattern(regexp =  "^\\d{4}-\\d{2}-\\d{2}$") String lastModDate, HttpServletRequest request,
                @RequestBody ReBody rebody, @PathVariable("id") int id) throws Exception{
    // Stuff here...
}
@RequestMapping(value=“/example/{id}”,method=RequestMethod.PUT)
公共响应属性更新(@RequestHeader(value=“last modified date”,required=true)@Pattern(regexp=“^\\d{4}-\\d{2}-\\d{2}$”)字符串lastModDate,HttpServletRequest,
@RequestBody ReBody ReBody,@PathVariable(“id”)int id)引发异常{
//这里的东西。。。
}

我使用的更简单的选项是为标题定义一个默认值,因此如果标题值等于默认值,那么它就会丢失。我已经重写了你的方法。见下文

// -- defaultValue = "missingHeader" --
@RequestMapping(value = "/example/{id}", method = RequestMethod.PUT)        
public ResponseEntity<> update(@RequestHeader(value="last-modified-date", defaultValue = "missingHeader") String lastModDate, HttpServletRequest request,
            @RequestBody ReBody rebody, @PathVariable("id") int id) throws Exception
{
    // --added this---
    if (lastModDate.equals("missingHeader")) // means header is missing
    {
        throw Exception();
    }
}
/--defaultValue=“missingHeader”--
@RequestMapping(value=“/example/{id}”,method=RequestMethod.PUT)
公共响应属性更新(@RequestHeader(value=“last modified date”,defaultValue=“missingHeader”)字符串lastModDate,HttpServletRequest请求,
@RequestBody ReBody ReBody,@PathVariable(“id”)int id)引发异常
{
//”他补充道---
if(lastModDate.equals(“missingHeader”)//表示缺少标头
{
抛出异常();
}
}

为什么不在这里的//Stuff中执行此操作。。。。这是两个独立的问题。如果缺少标头,则字符串将确实为空。验证确实取决于您,但一种可能的方法是定义您想要的确切格式,并尝试使用它进行提取。因为当标头为空时,它将在运行代码“//stuff”之前引发空点异常。现在格式已经定义好了,但是当格式不正确时,它抛出空点too@xiao是否将lastModDate作为字符串传递。我建议您以时间戳或ISO日期字符串形式发送日期,而不是像这样的字符串:
Mon,2017年8月28日02:51:09 GMT
您可以指向一些或提及一些关键字来查找包
javax.validation
的注释,或者一般的概念bean验证。
// -- defaultValue = "missingHeader" --
@RequestMapping(value = "/example/{id}", method = RequestMethod.PUT)        
public ResponseEntity<> update(@RequestHeader(value="last-modified-date", defaultValue = "missingHeader") String lastModDate, HttpServletRequest request,
            @RequestBody ReBody rebody, @PathVariable("id") int id) throws Exception
{
    // --added this---
    if (lastModDate.equals("missingHeader")) // means header is missing
    {
        throw Exception();
    }
}