gpt4 book ai didi

java - Jersey :禁止未指定的参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:40 26 4
gpt4 key购买 nike

我正在使用 Jersey 作为 JAX-RS 实现开发 REST API。

在每个资源中,我都明确定义了预期的参数:

@GET
@Path("/someData")
public Response getSomeData(
@QueryParam("id") final Long id,
@QueryParam("name") final String name) {
...
}

有许多固定参数,对所有资源(例如“locale”)都是通用的。

有什么办法(我可以引入特定于 Jersey 的依赖项)我可以禁止任何既不属于方法参数也不属于公共(public)参数的参数?

例如,如果用户调用

/api/resource/someData?id=10&locale=en - 他获取数据,但如果他调用

/api/resource/someData?id=10&locale=en&fakeParam=AAA - 返回状态 400,内容表明 fakeParam 是未知参数。

目前第二个请求的处理方式与第一个请求相同,fakeParam 被简单地忽略。

我认为所描述的验证将帮助我的 API 用户及早发现错误。

最佳答案

我不知道有什么方法可以用 JAX-RS 做到这一点,但您可以轻松推出自己的解决方案。这有点麻烦,但你可以这样做:

@Path("/api")
public class Service {

@Context
UriInfo uriInfo;

ImmutableSet<String> commonParams = ImmutableSet.of("locale");

@GET
@Path("validate")
@Produces(MediaType.APPLICATION_JSON)
public String validate(@QueryParam("foo") String param) {
Set<String> validParams = newHashSet(commonParams);

class Local {};
for (Annotation[] annotations: Local.class.getEnclosingMethod().getParameterAnnotations()) {
for (Annotation annotation: annotations) {
if (annotation instanceof QueryParam) {
validParams.add(((QueryParam)annotation).value());
}
}
}

if (!difference(uriInfo.getQueryParameters().keySet(), validParams).isEmpty()) {
//throw an unknown parameter exception
}

return "hello";
}

而且,如果您在 Jersey 中使用 Guice 或其他一些 AOP 工具,您可能会将其放入 aspect s.t.您不必为要验证的每个方法都添加样板文件。

关于java - Jersey :禁止未指定的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22043648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com