【问题标题】:Restlet : Use converter service in filterRestlet:在过滤器中使用转换器服务
【发布时间】:2014-06-12 12:49:32
【问题描述】:

我在一个项目中使用 spring 和 restlet。

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

我必须根据 ACCEPT 标头使用转换器服务(或连接服务)以 json/xml 格式返回响应。在过滤器中,我得到响应对象。我创建了一个自定义类的对象并使用有效的 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 标头?

谢谢。

【问题讨论】:

    标签: java rest restlet restlet-2.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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多