2014-06-12 3 views
1

프로젝트에서 spring 및 restlet을 사용하고 있습니다.Restlet : 필터에 변환기 서비스 사용

요청 URI가 유효한지 여부를 확인하고 유효한 URI 목록 (리소스 검색 메커니즘)을 반환하는 필터를 추가했습니다.

ACCEPT 헤더에 따라 변환기 서비스 (또는 conneg 서비스)를 사용하여 json/xml에서 응답을 반환해야합니다. 필터에서 응답 객체가 나타납니다. 나는 커스텀 클래스의 객체를 생성하고 그것을 유효한 URL로 채 웁니다. 이 객체를 응답에 전달하기 위해 json serializer를 사용하여 객체의 문자열 표현 (media type - 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를 반환하면 ACCEPT 헤더에 따라 변환기 서비스가 json 표현에서 XML 표현으로 또는 그 반대로 변환 할 수 있습니까?

감사합니다.

답변

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