2014-06-12 25 views
1

我在項目中使用了spring和restlet。Restlet:在過濾器中使用轉換器服務

我添加了一個過濾器,它檢查請求URI是否有效並返回有效URI列表(資源發現機制)。

我必須使用轉換器服務(或conneg服務)根據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標頭?

謝謝。

回答

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