我正在构建一个RESTful服务,其中应该根据资源文件描述生成端点。 使用隐式方法构建器处理程序注册资源可以正常工作,但是当我尝试用显式I替换隐式处理程序时,可以使用墙。
在下面的示例中,我已使用显式ItemInflector实现替换了隐式处理程序Inflector。执行后预期字符串结果。
final Resource.Builder resourceBuilder = Resource.builder();
resourceBuilder.path("api/myservice/item");
final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET");
methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE)
.handledBy(new ItemInflector<ContainerRequestContext, String>(String.class));
final Resource resource = resourceBuilder.build();
registerResources(resource);
ItenInflector实现:
public class ItemInflector<DATA extends ContainerRequestContext, RESULT> implements Inflector<DATA, RESULT> {
private Class<RESULT> type;
public ItemInflector(Class<RESULT> type) {
this.type = type;
}
@Override
public RESULT apply(DATA data) {
return type.cast("Half programmatically generated endpoint");
}
}
在运行时,当我尝试命中端点时,会引发以下错误。
Caused by: java.lang.IllegalArgumentException: Type parameter RESULT not a class or parameterized type whose raw type is a class
有人可以清楚我在Inflector实现中做错了什么吗? 如何参数化或定义RESULT类型?
答案 0 :(得分:2)
在tooltip: {
formatter: function() {
return '<b>' + this.series.name + '</b><br/>' +
this.x + ': $' + Highcharts.numberFormat(this.y, 0, '', ',');
}
}
实例创建期间指定的类型参数(<ContainerRequestContext, String>
)在运行时丢失。原因是Javas type erasure的行为。您必须在子类中指定类型或在此处使用匿名类。
选项1,匿名类(是的,现在编译器会保留类型信息):
ItemInflector
选项2,在sublcass中指定类型:
methodBuilder.produces(MediaType.TEXT_PLAIN_TYPE)
.handledBy(new Inflector<ContainerRequestContext, String>(){
...
});
以下是有关类型擦除行为的非常详细的信息:Java generics - type erasure - when and what happens