【问题标题】:Jersey ExceptionMapper not working with spring boot?Jersey ExceptionMapper 不能与弹簧靴一起使用?
【发布时间】:2018-10-23 21:20:04
【问题描述】:

我正在使用带有弹簧靴的球衣,并且我有一个异常映射器:

package org.smarter.providers;

import com.google.common.collect.ImmutableMap;
import org.smarter.exception.ApiException;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;

import java.util.Optional;

import static org.smarter.exception.UserException.UNAUTHORIZED;

@Provider
public class ExceptionMapper implements javax.ws.rs.ext.ExceptionMapper<ApiException> {

    @Override
    public Response toResponse(ApiException exception) {
        return Response.status(status(exception)).build();
    }

    private Integer status(ApiException exception) {
        return Optional.ofNullable(ImmutableMap.<String, Integer>builder()
                .put(UNAUTHORIZED, 401)
                .build()
                .get(exception.code()))
                .orElse(404);
    }
}

也注册了,使用调试,我可以看到这个映射器被正确调用,但是最终响应仍然返回 404,无论使用 junit 测试还是手动测试。

这是测试:

when()
                .get("/users/current/memos/daily")
                .then()
                .statusCode(401);

然后在 Jersey 配置中注册:

register(ExceptionMapper.class);

我正在使用带有弹簧靴的运动衫,不知道如何解决这个问题。任何建议将被认真考虑。

【问题讨论】:

标签: java spring-boot jersey jax-rs


【解决方案1】:

我可以看到这个映射器被正确调用,但是最终响应仍然返回404

这可能是您的status() 方法的实现问题。你确定exception.code()返回401吗?

顺便说一句,您是否需要使用OptionalImmutableMap 进行如此复杂的操作?你可以使用:

private Integer status(ApiException exception) {
    if (exception.code() == 401) {
        return exception.code();
    } else {
        return 404;
    }
}

【讨论】:

  • exception.code()实际上只返回一个字符串,它是我的应用程序中的异常代码,例如,如果用户未经授权,它将返回"unauthorized",我正在构建一个地图在我的异常代码和http状态代码之间,所以我使用ImmutableMap,其中key是我的异常代码,value是htt p状态代码,Optional用于不存在的映射。顺便说一句,我可以确认 exception.code() 在调试时通过评估返回“UNAUTHORIZED”,并且应该正确映射到 401。无论如何感谢您的回答。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2018-02-14
  • 2017-11-14
  • 1970-01-01
相关资源
最近更新 更多