Restlet:在过滤器中使用转换器服务

时间:2014-06-12 12:49:33

标签: java rest restlet restlet-2.0

我在项目中使用spring和restlet。

我添加了一个过滤器,用于检查请求URI是否有效,并返回有效URI列表(资源发现机制)。

我必须使用转换器服务(或连接服务)在json / xml中返回响应,具体取决于ACCEPT标头。在过滤器中,我得到响应对象。我创建了一个自定义类的对象,并使用有效的URL填充它。要将此对象传递给响应,我使用json序列化器创建对象的字符串表示形式(媒体类型 - json)并设置响应实体。

@Override
protected int beforeHandle(Request request, Response response) {    
    String relativeUri = request.getResourceRef().getRemainingPart();
    if(mappings.containsKey(relativeUri)) {
        return Filter.CONTINUE;
    }

    ArrayList<String> nextLevelURIs = getNextLevelResourcesUri(request);

    if(nextLevelURIs == null) {
        return Filter.CONTINUE;
    }

    Items items = getItems(nextLevelURIs);

    response.setEntity(serializer.serialize(items), MediaType.APPLICATION_JSON);
    return Filter.STOP;
}

要实现转换器服务,我必须检查ACCEPT标头并创建相应的表示(json / xml)。但我已经在其他资源类中使用转换器服务。

有没有办法在过滤器中使用转换器服务。如果我设置json字符串表示并返回Filter.CONTINUE,转换器服务可以将实体从json表示转换为xml表示,反之亦然,具体取决于ACCEPT标头吗?

感谢。

1 个答案:

答案 0 :(得分:1)

找到了一种方法。见代码。

@Override
protected int beforeHandle(Request request, Response response) {    
    String relativeUri = request.getResourceRef().getRemainingPart();
    if(mappings.containsKey(relativeUri)) {
        return Filter.CONTINUE;
    }

    ArrayList<String> nextLevelURIs = getNextLevelResourcesUri(request);

    if(nextLevelURIs == null) {
        return Filter.CONTINUE;
    }

    if(!request.getMethod().equals(Method.GET)) {
        response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
        return Filter.STOP;
    }

    ArrayList<Variant> variantList = new ArrayList<Variant>();

    Application application = getApplication();

    variantList.add(new Variant(MediaType.APPLICATION_XML));
    variantList.add(new Variant(MediaType.APPLICATION_JSON));

    Variant variant = application.getConnegService().getPreferredVariant(variantList, request, application.getMetadataService());

    Items items = (relativeUri.equals("/")) ? getVersionItems(nextLevelURIs) : getItems(nextLevelURIs);

    try {           response.setEntity(application.getConverterService().toRepresentation(items, variant, null));
    } catch (IOException e) {
        throw new ServerException(e.getMessage());
    }

    return Filter.STOP;
}