【问题标题】:How to use instance PathParam to create an object如何使用实例 PathParam 创建对象
【发布时间】:2018-08-15 16:00:34
【问题描述】:

假设我有一个这样的 JAX-RS Web 服务:

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;

@Path("/somePath/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SomeObject {

    @PathParam("id")
    private String id;

    @GET
    @Path("/something")
    public String something() {

        DbObject dbObject = new DbObject(id);

        // return something

    }

    @POST
    @Path("/somethingElse")
    public void somethingElse(Arg1 arg1, Arg2 arg2) {

        DbObject dbObject  = new DbObject(id);

        // do something else with it

    }

    ...

}

我几乎所有方法的第一行都是创建我的 dbObject

有没有办法在 id 设置后立即执行此操作?

我可以在 id setter 中这样做吗?会调用 setId 方法而不是填充 id 变量的值吗?

或者我还有什么其他选择?

【问题讨论】:

  • 你可以使用注入。
  • @Berger 你能给我举个例子吗?我不确定我知道你指的是什么。
  • 查看以下链接,(例如 Spring,是最常见的依赖注入框架之一):stackoverflow.com/questions/3334578/…
  • 我希望有一些不需要完整的代码重新架构的东西。 :P
  • 为什么不用注射?

标签: java jax-rs


【解决方案1】:

引用@PathParam 文档:

带注释的参数、字段或属性的类型必须是:

  • PathSegment,该值将是路径匹配部分的最后一段。有关检索所有请求路径段的方法,请参阅 UriInfo
  • List<javax.ws.rs.core.PathSegment>,该值将是与命名模板参数匹配的路径段对应的PathSegment 列表。有关检索所有请求路径段的方法,请参阅 UriInfo
  • 是原始类型。
  • 有一个接受单个 String 参数的构造函数。
  • 有一个名为 valueOffromString 的静态方法,它接受单个 String 参数(例如,请参阅 Integer.valueOf(String))。
  • 有一个ParamConverterProvider JAX-RS 扩展 SPI 的注册实现,它返回一个能够对类型进行“来自字符串”转换的 ParamConverter 实例。

如果您满足上述条件之一,您将能够使用:

@PathParam("id")
private DbObject dbObject;

让我们关注最后三种方法。首先,使用带有单个 String 参数的构造函数:

public class DbObject {

    private String id;

    public DbObject(String id) {
        this.id = id;
    }

    ...
}

您也可以使用valueOf(String) 方法:

public class DbObject {

    private String id;

    public DbObject(String id) {
        this.id = id;
    }

    public static DbObject valueOf(String id) {
        return new DbObject(id);
    }

    ...
}

或者定义一个ParamConverterProvider

@Provider
public class DbObjectParamConverterProvider implements ParamConverterProvider {

    @Override
    public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, 
                                              Annotation[] annotations) {

        if (rawType.getName().equals(DbObject.class.getName())) {

            return new ParamConverter<T>() {

                @Override
                public T fromString(String value) {
                    return rawType.cast(new DbObject(value));
                }

                @Override
                public String toString(T value) {
                    return ((DbObject) value).getId();
                }
            };
        }

        return null;
    }
}

【讨论】:

  • 我认为第一种方法正是我想要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-08
  • 2020-10-10
  • 1970-01-01
  • 2011-03-05
  • 2017-06-16
  • 2019-12-14
  • 1970-01-01
相关资源
最近更新 更多