【问题标题】:406 Status on Response when invoking setErrorResult on DeferredResult在 DeferredResult 上调用 setErrorResult 时响应的 406 状态
【发布时间】:2015-04-09 04:53:29
【问题描述】:

我正在尝试创建一个简单的 Spring RestController,它使用 RxJava 的 Observable 类来执行异步处理。这是我的代码:

@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,这正是我所期望的。如果您知道为什么会发生这种情况,请告诉我。

提前感谢您的帮助。

【问题讨论】:

    标签: spring-mvc rx-java


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2019-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多