如何使用实例PathParam创建对象

时间:2018-03-07 14:03:11

标签: 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.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设置器中执行此操作吗?是否会调用setId方法而不是填充id变量的值?

或者我还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

引用@PathParam文档:

  

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

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

如果您符合上述标准之一,您将可以使用:

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