java - 重置 : Use converter service in filter

标签 java rest restlet restlet-2.0

我在项目中使用spring和reSTLet。

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

我必须根据 ACCEPT header 使用转换器服务(或 conneg 服务)以 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 header 并创建相应的表示(json/xml)。但我已经在其他资源类中使用转换器服务。

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

谢谢。

最佳答案

找到了一种方法来做到这一点。请参阅代码。

@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;
}

关于java - 重置 : Use converter service in filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24184869/

相关文章:

java - 找到使权重总和最小的配对?

javascript - 适用于所有组合的 JSON faker

json - 如何覆盖 Jersey 客户端中的响应 header

java - 有没有办法让 ReSTLet Swagger 扩展限制它显示的 API?

java - Jackson:使用单个条目将字符串序列化/反序列化为数组

java - NoSuchAlgorithmException : der KeyStore not available

java - 确保 SpringLayout 不会缩小到一定大小以下

java - MethodHandle和线程安全

Java Swing——Jpanel,Jtable 中嵌入了 Jbuttons

javascript - 可以在没有 REST API 的情况下使用 AngularJS 吗?