定制球衣Inflector

时间:2016-03-22 15:58:31

标签: java jersey jax-rs jersey-2.0

我正在构建一个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类型?

1 个答案:

答案 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