在DeferredResult调用setErrorResult时406个状态的响应(406 Stat

2019-10-22 14:00发布

我试图创建一个使用RxJava的可观察类来执行异步处理一个简单的Spring RestController。 这里是我的代码:

@RestController
@RequestMapping("/users")
public class UserController {
   @Autowired
   private UserAsyncRepository repository;

   @RequestMapping(value="/{userName}", method=GET)
   public DeferredResult<ResponseEntity<User>> getByUserName(
      @PathVariable String userName) {
      final DeferredResult<ResponseEntity<User>> deferred = 
         new DeferredResult<ResponseEntity<User>>();
      repository
         .findByUserName(userName)    // returns Observable<User>
         .singleOrDefault(null)
         .timeout(1, TimeUnit.SECONDS)
         .subscribe(u -> {
              if(u == null) {
                 deferred.setErrorResult(ResponseEntity.notFound());
              } else {
                 deferred.setResult(ResponseEntity.ok(u));
              }
           }, t -> {
              deferred.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR));
           }
         );
      return deferred;
   }
}

当此方法是用有效的用户名调用,我得到我期待着与状态200。当调用此方法与无效的用户名的响应,响应是406而不是404,这是我所期望的。 让我知道如果你有任何想法,为什么发生这种情况。

在此先感谢您的帮助。

Answer 1:

通过传递一个例外DeferredResult类的setErrorResult方法的一个实例,我能得到404响应预期。 这里是我的异常类:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
   private static final long serialVersionUID = 1L;

   public ResourceNotFoundException(String message) {
      super(message);
   }
}

关键是确保你的@ResponseStatus注释添加到您的自定义异常类。

HTH。



文章来源: 406 Status on Response when invoking setErrorResult on DeferredResult