有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

我必须使用converter服务(或conneg服务)返回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;
}

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

有没有办法在过滤器中使用转换器服务。如果我设置json字符串表示并返回过滤器。继续,converter服务能否根据ACCEPT标头将实体从json表示转换为xml表示,或者反之亦然

谢谢


共 (1) 个答案

  1. # 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;
    }