【问题标题】:how to return not found status from spring controller如何从弹簧控制器返回未找到状态
【发布时间】:2014-04-27 11:31:49
【问题描述】:

我有以下spring控制器代码,如果在数据库中找不到用户,想返回未找到状态,怎么办?

@Controller
public class UserController {
  @RequestMapping(value = "/user?${id}", method = RequestMethod.GET)
  public @ResponseBody User getUser(@PathVariable Long id) {
    ....
  }
}

【问题讨论】:

    标签: spring spring-mvc model-view-controller controller


    【解决方案1】:

    有了最新的更新,你就可以使用了

    return ResponseEntity.of(Optional<user>);
    

    其余的由下面的代码处理

        /**
         * A shortcut for creating a {@code ResponseEntity} with the given body
         * and the {@linkplain HttpStatus#OK OK} status, or an empty body and a
         * {@linkplain HttpStatus#NOT_FOUND NOT FOUND} status in case of a
         * {@linkplain Optional#empty()} parameter.
         * @return the created {@code ResponseEntity}
         * @since 5.1
         */
        public static <T> ResponseEntity<T> of(Optional<T> body) {
            Assert.notNull(body, "Body must not be null");
            return body.map(ResponseEntity::ok).orElse(notFound().build());
        }
    

    【讨论】:

      【解决方案2】:

      public static ResponseEntity of(可选正文)

      在 Optional.empty() 参数的情况下创建具有给定正文和 OK 状态的 ResponseEntity 或空正文和 NOT FOUND 状态的快捷方式。

      @GetMapping(value = "/user/{id}")
      public ResponseEntity<User> getUser(@PathVariable final Long id) {
          return ResponseEntity.of(userRepository.findOne(id)));
      }
      
      public Optional<User> findOne(final Long id) {
          MapSqlParameterSource paramSource = new MapSqlParameterSource().addValue("id", id);
          try {
              return Optional.of(namedParameterJdbcTemplate.queryForObject(SELECT_USER_BY_ID, paramSource, new UserMapper()));
          } catch (DataAccessException dae) {
              return Optional.empty();
          }
      }
      

      【讨论】:

        【解决方案3】:

        需要使用 ResponseEntity 或 @ResponseStatus,或使用“extends RuntimeException”

        @DeleteMapping(value = "")
            public ResponseEntity<Employee> deleteEmployeeById(@RequestBody Employee employee) {
        
                Employee tmp = employeeService.deleteEmployeeById(employee);
        
                return new ResponseEntity<>(tmp, Objects.nonNull(tmp) ? HttpStatus.OK : HttpStatus.NOT_FOUND);
            }
        

        @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="was Not Found")
        

        【讨论】:

          【解决方案4】:

          将您的处理程序方法更改为具有ResponseEntity 的返回类型。然后你可以适当地返回

          @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
          public ResponseEntity<User> getUser(@PathVariable Long id) {
              User user = ...;
              if (user != null) {
                  return new ResponseEntity<User>(user, HttpStatus.OK);
              }
              return new ResponseEntity<>(HttpStatus.NOT_FOUND);
          }
          

          Spring 将使用与 @ResponseBody 相同的 HttpMessageConverter 对象来转换 User 对象,但现在您可以更好地控制要在响应中返回的状态代码和标头。

          【讨论】:

            【解决方案5】:

            使用方法引用运算符::可以更短

            @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
            public ResponseEntity<User> getUser(@PathVariable Long id) {
               return Optional.ofNullable(userRepository.findOne(id))
                    .map(ResponseEntity::ok)
                    .orElse(ResponseEntity.notFound().build());
            }
            

            【讨论】:

              【解决方案6】:

              JDK8 方法:

              @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
              public ResponseEntity<User> getUser(@PathVariable Long id) {
                  return Optional
                          .ofNullable( userRepository.findOne(id) )
                          .map( user -> ResponseEntity.ok().body(user) )          //200 OK
                          .orElseGet( () -> ResponseEntity.notFound().build() );  //404 Not found
              }
              

              【讨论】:

              • ResponseEntity.notFound().build() 导致以下警告(SpringWeb 4.3.1):Bad return type in lambda expression: ResponseEntity&lt;Void&gt; cannot be converted to ResponseEntity&lt;User&gt;
              猜你喜欢
              • 2016-12-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-19
              • 2017-09-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多