【问题标题】:Replying with a json for a Spring Restful Web Service使用 json 回复 Spring Restful Web 服务
【发布时间】:2014-04-29 19:14:07
【问题描述】:

我有一个 Spring MVC 宁静的 web 服务,它回复所有产品的列表。

目前,我正在将所有数据返回到一个 Bean 列表中。

List<ProdBean> results = jdbcTemplate.query("select * from Prods",
    new RowMapper<ProdBean>() {
    @Override
    public ProdBean mapRow(ResultSet rs, int rowNum) throws SQLException {
        ProdBean gb = new ProdBean();
        gb.setProdId(rs.getInt("ProdId"));
        gb.setProdName(rs.getInt("ProdName"));
        // Few more params
        return gb;
    }
});

return results; //I want to convert this to a json object. 

如何转换List&lt;ProdBean&gt; results 以创建一个json 对象并将其用作返回参数?

类似的东西 -

[{"prodId":1, "prodName":"A"}, {"prodId":2, "prodName":"B"}, ... ]

这可以使用一些注释来完成吗?

【问题讨论】:

    标签: java json spring rest spring-mvc


    【解决方案1】:

    使用@ResponseBody 注释。返回值将转换为JSON(默认使用Jackson)。

    @Controller
    @RequestMapping("/foo")
    public class JSONController {
    
        /**
         * This method will return [{"prodId":1, "prodName":"A"}, {"prodId":2, "prodName":"B"}, ... ]
         */
        @ResponseBody
        @RequestMapping(value="/bar", method = RequestMethod.GET)
        public List<ProdBean> getJson() {
            List<ProdBean> results = ...
            return results;
        }
    }
    

    如果你使用Spring 4,你可以使用新的@RestController注解并去掉方法上的@ResponseBody注解。

    更新

    你必须在类路径中有.jar

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-databind</artifactId>
         <version>2.2.2</version>
    </dependency>
    
    <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-annotations</artifactId>
         <version>2.2.2</version>
    </dependency>
    
    <dependency>
         <groupId>com.fasterxml.jackson.core</groupId>
         <artifactId>jackson-core</artifactId>
         <version>2.2.2</version>
     </dependency>
    

    【讨论】:

    • 我使用的是Spring 4.0,所以我只需要将@ResponseBody 替换为@RestController。使用时我得到Error 406 - The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.
    • 你的配置文件中有 吗?
    • 你在客户端使用什么?你也可以发布 ProdBean 对象吗?
    • 我只是通过 Chrome 测试它,点击 localhost:8080/prodWS/service。给了一个sysout来测试List大小的大小。它准确地打印回来。
    • 你能显示 ProdBean 对象吗?也许杰克逊由于某种原因无法对其进行转换......你的类路径中有杰克逊罐子吗?
    【解决方案2】:

    在返回类型定义上使用@responsebody 注释,如果您在设置中使用了 mvc 注释驱动,它应该可以正常工作。返回类型必须与 Json 匹配。

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2014-11-03
      • 1970-01-01
      • 2015-02-20
      • 2018-10-25
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多