假设我有一个像这样的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变量的值?
或者我还有其他选择吗?
答案 0 :(得分:1)
引用@PathParam
文档:
带注释的参数,字段或属性的类型必须:
- Be
PathSegment
,该值将是路径匹配部分的最后一段。有关检索所有请求路径段的方法,请参阅UriInfo
。- Be
List<javax.ws.rs.core.PathSegment>
,该值将是与命名模板参数匹配的路径段对应的PathSegment列表。有关检索所有请求路径段的方法,请参阅UriInfo
。- 是一种原始类型。
- 拥有一个接受单个
String
参数的构造函数。- 使用名为
valueOf
或fromString
的静态方法接受单个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);
}
...
}
@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;
}
}