【问题标题】:Return JSON string from spring controller从 spring 控制器返回 JSON 字符串
【发布时间】:2016-05-12 06:52:59
【问题描述】:

我编写了一个服务,它通过来自 solr 的 AJAX 调用进行查询,并将搜索结果作为 json 返回。我想将此 json 从我的控制器返回到 AJAX。

public class SearchServiceImpl implements SearchService {
private String getSearchResults(String url) throws ClientProtocolException,
            IOException {
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(url);
        HttpResponse response = client.execute(get);
        //logger.info("Response: " + response.getEntity().getContent());
         BufferedReader rd = new BufferedReader(new InputStreamReader(response
         .getEntity().getContent()));
         StringBuilder sb = new StringBuilder();
         String line = "";
         while ((line = rd.readLine()) != null) {
             sb.append(line);
         }
         return sb.toString();
    }

public String performSearch(String term) {
        String result = "";
        try {
            result = getSearchResults(getSolrURL(term)); // getSolrURL() prepares the solr url
        } catch (ClientProtocolException e) {
            logger.error(e);
        } catch (IOException e) {
            logger.error(e);
        }
        return result;
    }
}

这是我的控制器中的 handleRequest() 方法 -

public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        logger.info("Perform search view");
        String term = request.getParameter("term");
        String result = searchService.performSearch(term);
        // Here I need to return result which is a json
        ModelAndView mav = new ModelAndView(new MappingJackson2JsonView());
//      mav.addObject("key1", "value1"); 
//      mav.addObject("key2", "value2");
        return mav;

    }

【问题讨论】:

    标签: json ajax spring


    【解决方案1】:

    最好的办法是让Jackson自动完成所有的序列化。所以你的控制器看起来像这样

    @RequestMapping(value = "/payment/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody Payment get(@PathVariable Long id) {
                return paymentService.getById(id);
            }
    

    Payment 类为 Jackson 提供了所有的 getter 和 setter

    package net.isban.example.vo;
    
        public class Payment {
    
        private Long id;
    
        private String sort;
    
        private String account;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getSort() {
            return sort;
        }
    
        public void setSort(String sort) {
            this.sort = sort;
        }
    
        public String getAccount() {
            return account;
        }
    
        public void setAccount(String account) {
            this.account = account;
        }
    
        @Override
        public String toString() {
            return "Payment [id=" + id + ", sort=" + sort + ", account="
                    + account + "]";
        }
    
    }
    

    并确保在类路径中包含 Jackson

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

    这里假设你使用的是 Spring,否则你仍然可以使用 Jackson 来生成 json:

    String json = new ObjectMapper().writeValueAsString(payment);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 2015-12-12
      • 2015-04-06
      • 2011-12-02
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多