Как я могу обслуживать RDF-представление модели Java через Spring MVC?
У меня есть представления JSON и XML, работающие с использованием механизмов согласования содержимого Spring, и я хотел бы сделать то же самое для RDF.
Как я могу обслуживать RDF-представление модели Java через Spring MVC?
У меня есть представления JSON и XML, работающие с использованием механизмов согласования содержимого Spring, и я хотел бы сделать то же самое для RDF.
Предполагая, что вы используете конфигурацию на основе аннотаций для своего приложения MVC, на самом деле это может быть довольно просто. Используя Проблемы типов носителей для Текстовые форматы RDF в качестве руководства по спецификации типа контента, довольно легко расширить существующее решение. Реальный вопрос заключается в том, какой тип сериализации вам нужен при запросе RDF? Если мы используем Jena в качестве базовой технологии модели, то поддержка любой из стандартных сериализаций является тривиальной из коробки. Json - единственный, который доставил мне небольшую трудность, но вы уже решили это.
Как видите, реализовать сериализацию (используя стандартную Jena, без дополнительных библиотек) на самом деле довольно просто! В конечном итоге проблема заключается в том, чтобы просто сопоставить правильную сериализацию с предоставленным типом контента.
ИЗМЕНИТЬ 19 апреля 2014 г.
Предыдущие типы контента были из документа, отражающего обсуждения рабочей группы. Пост был отредактирован, чтобы отразить типы контента реестр IANA Media Type дополнен RDF1.1 N-Triples и JSON-LD стандарты.
@Controller
public class SpecialController
{
public Model model = null; // set externally
@RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"application/x-javascript", "application/json", "application/ld+json"})
public @ResponseBody String getModelAsJson() {
// Your existing json response
}
@RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"application/xml", "application/rdf+xml"})
public @ResponseBody String getModelAsXml() {
// Note that we added "application/rdf+xml" as one of the supported types
// for this method. Otherwise, we utilize your existing xml serialization
}
@RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"application/n-triples"})
public @ResponseBody String getModelAsNTriples() {
// New method to serialize to n-triple
try( final ByteArrayOutputStream os = new ByteArrayOutputStream() ){
model.write(os, "N-TRIPLE");
return os.toString();
}
}
@RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"text/turtle"})
public @ResponseBody String getModelAsTurtle() {
// New method to serialize to turtle
try( final ByteArrayOutputStream os = new ByteArrayOutputStream() ){
model.write(os, "TURTLE");
return os.toString();
}
}
@RequestMapping(value="your/service/location", method=RequestMethod.GET, produces={"text/n3"})
public @ResponseBody String getModelAsN3() {
// New method to serialize to N3
try( final ByteArrayOutputStream os = new ByteArrayOutputStream() ){
model.write(os, "N3");
return os.toString();
}
}
}
Я предварю это, упомянув, что я ничего не знаю о Spring MVC. Но если у вас есть объект Java, который вы хотите сериализовать как RDF, библиотека, такая как Empire (я автор) может вам помочь. Вы можете аннотировать объект, чтобы указать, какие вещи должны быть преобразованы в RDF, а затем использовать класс RdfGenerator
, чтобы вернуть граф RDF, представляющий объект. Затем вы можете использовать что-то вроде RIO модуля записи RDF из среды Sesame для сериализации графа в соответствии с запрошенной сериализацией RDF.
Я знаю, что это не специфично для Spring MVC, но если вы можете получить OutputStream и запрошенный тип контента, вы сможете заставить его работать с RIO Empire & Sesame.
mvn clean install
приводит к следующей ошибке. The following artifacts could not be resolved: com.clarkparsia:cp-common-openrdf:jar:0.8
- person user86834; 26.06.2013
Кроме того, необходимо добавить параметр charset
. StringHttpMessageConverter по умолчанию использует кодировку символов ISO-8859-1, если вы ее не измените. Если выходной формат имеет фиксированную кодировку, отличную от ISO-8859-1 (например, UTF-8), он должен быть объявлен в produces
. Такое поведение соответствует спецификациям. Например, если модель содержит символы, отличные от ASCII, и закодирована в turtle
, в спецификации указано, что тип носителя text/turtle должен содержать параметр charset
со значением UTF-8
. В противном случае это необязательно.
@RequestMapping(value = "your/service/location", method = RequestMethod.GET,
produces = { "text/turtle;charset=UTF-8"})
public @ResponseBody String getModelAsTurtle() throws IOException {
try (final ByteArrayOutputStream os = new ByteArrayOutputStream()) {
RDFDataMgr.write(os, model, RDFFormat.TURTLE_PRETTY);
return os.toString();
}
}