2

如何通过 Spring MVC 提供 Java 模型的 RDF 表示?

我有使用 Spring 的内容协商机制工作的 JSON 和 XML 表示,并希望对 RDF 做同样的事情。

4

3 回答 3

3

假设您正在为 MVC 应用程序使用注释驱动配置,这实际上可能非常简单。使用 W3C 的Text RDF 格式的媒体类型问题作为内容类型规范的指南,很容易扩充您现有的解决方案。真正的问题是,当请求 RDF 时,您想要的序列化类型是什么?如果我们使用 Jena 作为底层模型技术,那么支持任何标准序列化都是开箱即用的。Json 是唯一给我带来一点困难的,但你已经解决了。

如您所见,序列化的实现(使用标准 Jena,无需额外的库)实际上很容易做到!问题最终只是将正确的序列化与提供的内容类型相匹配。

编辑 2014 年 4 月 19 日

以前的内容类型来自捕获工作组讨论的文档。该帖子已经过编辑,以反映IANA 媒体类型注册表的内容类型,并辅以RDF1.1 N-TriplesJSON-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();
       }
    }
}
于 2013-06-27T15:24:26.067 回答
1

我将首先提到我对 Spring MVC 一无所知。但是,如果您有一个想要序列化为 RDF 的 Java 对象,那么像Empire(我是作者)这样的库可能会对您有所帮助。您可以对对象进行注释以指定应将哪些内容转换为 RDF,然后使用RdfGenerator该类返回表示该对象的 RDF 图。然后,您可以使用 Sesame 框架中的RIO RDF 编写器之类的东西将图形序列化为请求的任何 RDF 序列化。

我知道这不是 Spring MVC 特定的,但如果您可以获得 OutputStream 和请求的内容类型,您应该能够使其与 Empire & Sesame 的 RIO 一起使用。

于 2013-06-26T12:22:11.713 回答
0

此外,您必须添加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();
    }
  }
于 2014-10-05T14:11:29.987 回答