如何配置spring web-mvc返回资源的xml/json等不同视图

1.首先,列出两个很有用的资源:

  1. Spring 3 MVC ContentNegotiatingViewResolver Example

  2. Spring REST 3 to Support XML and JSON

我按照链接1说明下载了示例代码,根据链接2解决了示例代码中的问题。

2.spring web-mvc是怎样区分不同的视图请求(xml or json or ?)

spring web-mvc支持给资源返回不同形式的视图,现在有两种方式指定返回的视图类型:

a.通过URL后缀指定视图类型

  • http://sample.com/resource.xml 返回资源的xml视图
  • http://sample.com/resource.json 返回资源的json视图

b.通过在HTTP请求头的Accept参数里列出期望的资源类型(media-types)

  • Accept:application/xml 指定返回xml视图
  • Accept:application/json 指定返回json视图

3.配置ContentNegotiatingViewResolver来支持返回多种视图

下面是配置ContentNegotiatingViewResolver的一段spring配置文件:

<bean
  class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"
  p:order="1">
  <property name="mediaTypes">
    <map>
      <entry key="xml" value="application/xml" />
      <entry key="json" value="application/json" />
    </map>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
        <property name="marshaller">
          <bean class="org.springframework.oxm.xstream.XStreamMarshaller"
            p:autodetectAnnotations="true" />
        </property>
      </bean>
      <bean
        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>

这段配置需要说明的有:

  1. 指定”后缀-资源类型”映射:<entry key=”xml” value=”application/xml” />,这样通过后缀就能对应到资源类型。
  2. 提供处理xml/json资源类型的bean,这里用来处理xml视图的bean是org.springframework.web.servlet.view.xml.MarshallingView,处理json视图的bean是
    org.springframework.web.servlet.view.json.MappingJacksonJsonView。

4.实现一个简单的Controller

class Somebody {
  private String name;
  private boolean isMale;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public boolean isMale() {
    return isMale;
  }

  public void setMale(boolean isMale) {
    this.isMale = isMale;
  }
}

@Controller
@RequestMapping("/hi")
public class Hi {
  @RequestMapping(value = "{name}", method = RequestMethod.GET)
  public @ModelAttribute
  Somebody getShopInJSON(@PathVariable String name) {
    Somebody somebody = new Somebody();
    somebody.setName(name);
    somebody.setMale(true);
    return somebody;
  }
}

注意!这里返回的对象,用的是@ModelAttribute注解。

5.部署和测试

把工程打成war包,部署到web容器下测试,访问http://host:port/hi/bob.json或是http://host:port/hi/bob.xml。

列下我的pom.xml的依赖:

...
  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>

    <!-- for xml -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>3.1.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.3</version>
    </dependency>

    <!-- for json -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.10</version>
    </dependency>

  </dependencies>
</project>

最后,感谢…!

使用ruby解析xml的简单例子

在使用hudson持续集成的工作中,我们会在构建完成后运行一个自动部署脚本。
自动部署脚本需要知道构建的模块信息,用ruby解析pom.xml是比较合适的选择。

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <artifactId>sample</artifactId>
        <version>0.1.9-SNAPSHOT</version>
...
</project>

ruby脚本片段如下:

#!/usr/bin/env ruby

require "rexml/document"
doc = REXML::Document.new(File.open('pom.xml'))

artifactId = doc.elements["project/artifactId"].text
version = doc.elements["project/version"].text

上面的脚本,使用rexml模块解析xml。
注意:如果版本号是通过继承得来(或是在profile里指定的),先使用maven生成实际生效的pom.xml才能获得正确的结果。
Tips:使用mvn help:effective-pom生成实际生效的pom。