我在项目中使用spring和restlet。
我添加了一个过滤器,用于检查请求URI是否有效,并返回有效URI列表(资源发现机制)。
我必须使用转换器服务(或连接服务)在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;
}
要实现转换器服务,我必须检查ACCEPT标头并创建相应的表示(json / xml)。但我已经在其他资源类中使用转换器服务。
有没有办法在过滤器中使用转换器服务。如果我设置json字符串表示并返回Filter.CONTINUE,转换器服务可以将实体从json表示转换为xml表示,反之亦然,具体取决于ACCEPT标头吗?
感谢。
答案 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;
}