Java 如何使用实例PathParam创建对象

Java 如何使用实例PathParam创建对象,java,jax-rs,Java,Jax Rs,假设我有这样一个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.W

假设我有这样一个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后立即执行此操作

我可以在身份证设定器里做吗?是否调用setId方法而不是填充id变量的值

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

引用文档:

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

如果是PathSegment,则该值将是路径匹配部分的最后一段。有关检索所有请求路径段的方法,请参见UriInfo。 如果是列表,则该值将是与命名模板参数匹配的路径段相对应的PathSegment列表。有关检索所有请求路径段的方法,请参见UriInfo。 是一个原始类型。 具有接受单个字符串参数的构造函数。 有一个名为valueOf或fromString的静态方法,该方法接受单个字符串参数,例如,请参见Integer.valueOfString。 拥有ParamConverterProvider JAX-RS扩展SPI的注册实现,该扩展SPI返回能够对类型进行from字符串转换的ParamConverter实例。 如果您满足上述标准之一,您将能够使用:

@PathParam("id")
private DbObject dbObject;
让我们关注最后三种方法。首先,使用带有单个字符串参数的构造函数:

public class DbObject {

    private String id;

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

    ...
}
或者,您可以使用valueOfString方法:

或定义一个:


你可以用注射。@Berger你能给我举个例子吗?我不确定我是否知道您指的是什么。请参阅以下链接,例如Spring,它是最常见的依赖项注入框架之一:我希望它不需要完全的代码重新架构:为什么不注射呢?我想第一种方法正是我想要的。非常感谢。
public class DbObject {

    private String id;

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

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

    ...
}
@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;
    }
}