当前位置: 首页 > 知识库问答 >
问题:

从接口设置Jersey响应状态代码而不返回响应

孙弘博
2023-03-14
@Path("/roles")
public interface IRoleService {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    Role create(Role role);

}

因为它创建了一个新的资源,所以如果它返回状态代码201是合适的,但目前它返回200。

我发现如何设置状态代码的唯一方法是让方法返回一个javax.ws.rs.core.Response并在那里设置它,但我确实不希望我的所有接口返回一个泛型响应,而不是实际的响应对象(在本例中是role)。

共有1个答案

程景胜
2023-03-14

一种方法是创建一个自定义注释,并使用响应过滤器来设置状态。例如

注释

@NameBinding
@Target({METHOD, TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Status {
    int DEFAULT_CODE = 0;

    int code() default DEFAULT_CODE;
}

ContainerResponseFilter

@Status
@Provider
public class StatusFilter implements ContainerResponseFilter {

    @Context
    private ResourceInfo info;

    @Override
    public void filter(ContainerRequestContext req, ContainerResponseContext res) throws IOException {
        Status status = getInterfaceAnnotation(info.getResourceMethod());
        if (status != null) {
            int code = status.code();
            if (code != Status.DEFAULT_CODE && res.getStatus() == 200) {
                res.setStatus(code);
            }
        }
    }

    private static Status getInterfaceAnnotation(Method resourceMethod) {
        String methodName = resourceMethod.getName();
        Class<?>[] paramTypes = resourceMethod.getParameterTypes();
        Class<?> iface = resourceMethod.getDeclaringClass().getInterfaces()[0];
        Method ifaceMethod;
        try {
            ifaceMethod = iface.getDeclaredMethod(methodName, paramTypes);
        } catch (NoSuchMethodException e) {
            return null;
        }
        return ifaceMethod.getAnnotation(Status.class);
    }
}

在过滤器中,我们使用ResourceInfo获得方法,并执行一些反射以获得@status注释。从那里,可以获取状态代码并将其设置在响应上。

由于它是一个名称绑定筛选器,因此只对用它注释的方法调用它。在这里看到更多。

然后要使用它,只需将注释添加到方法中。

public interface ITestResource {
    @GET
    @Status(code=201)
    String get();
}
 类似资料:
  • 问题内容: 我有一个API调用,我需要对其进行一些检查并可能返回各种状态代码。我不需要自定义视图或任何东西,我只需要返回正确的代码。如果用户未通过适当的凭据,则需要返回401状态。如果他们尚未发送受支持的请求格式,则需要返回400状态。 因为它是一个API,所以我真正想做的就是设置响应状态并以一条简单的愚蠢消息退出,该消息说明请求失败的原因(可能使用)。刚好足以完成工作,但我还无法使其正常工作。我

  • 我使用curl获取http头以查找http状态代码并返回响应。我使用以下命令获取http头

  • 我试图让ApacheHttpClient触发HTTP请求,然后显示HTTP响应代码(200404500等)以及HTTP响应正文(文本字符串)。需要注意的是,我使用的是因为大多数HttpClient示例都来自和API从版本3到版本4发生了巨大变化。 不幸的是,我只能让HttpClient返回状态代码或响应主体(但不是两者)。 这是我所拥有的: 所以我问:使用库,如何从同一

  • 我有一个Restendpoint,如果没有产品,它将返回204,以及以下通用角度服务: 和 但是,当服务生成 204 代码时,我收到以下错误: TypeError:无法读取null的属性“status” 这怎么可能发生?如果 API 以 204 响应,为什么整个响应为空?

  • 我在android上使用MapBox方向图,我只是想得到以后在地图上绘制的方向图。 但是,我从调用中得到的响应从来都不可用,因为response.body()返回null。 当我打电话回应时。code()我得到状态代码422,根据Mapbox API,这意味着“给定的请求无效。响应的消息键将包含对无效输入的解释。” 回应。message()返回字符串“Unknown”。 response.erro

  • 当我使用MVC控制器时,我使用“返回OK(对象)”或“返回BadRequest(ErrorMessage)”等。 我怎样才能实现这是剃刀页? 我尝试返回新的JSON result(object);这在状态代码为200时有效。但是如果我想返回带有JSON错误消息的状态代码400呢?