【问题标题】:Spring Boot rest controller: how to return clean jsonSpring Boot 休息控制器:如何返回干净的 json
【发布时间】:2021-06-15 18:07:35
【问题描述】:

我已将此方法设置为从 Spring Boot 休息控制器返回响应:

public ResponseEntity<Map<String, Object>> get(@PathVariable("id") long id) {
    try {
        return new ResponseEntity<>(this.ReportDAO.read("dbuser1"), HttpStatus.OK);
    } catch (Exception e) {
        return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

这是DAO方法:

@Autowired
private JdbcTemplate jdbcTemplate;
public Map<String, Object> read(String testParam) {
    List<SqlParameter> parameters = Arrays.asList(new SqlParameter(Types.NVARCHAR));
    CallableStatementCreator csc = new CallableStatementCreator() {
        @Override
        public CallableStatement createCallableStatement(Connection con) throws SQLException {
            CallableStatement cs = con.prepareCall("{call test (?)}");
            cs.setString(1, testParam);
            return cs;
        }
    };

    return jdbcTemplate.call(csc, parameters);
}

我成功地将一个 json 对象作为响应,但格式如下:

#result-set-1: [ {…}, {…} ]

虽然我期待:

[ {…}, {…} ]

为什么将结果集插入#result-set-1 键?如何修改此行为?

【问题讨论】:

    标签: spring spring-boot spring-restcontroller


    【解决方案1】:

    JdbcTemplate#call 返回 Map 您可以通过使用键 #result-set-1 从映射中专门提取键来更改此行为。

    这就是我的做法:

    sql

    CREATE TABLE `sample_log` (
      `id` bigint NOT NULL AUTO_INCREMENT,
      `message` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    

    插入语句:

    insert into sample_log (message) values('West Country');
    insert into sample_log (message) values('Welcome User');
    

    存储过程:

    CREATE PROCEDURE  `fetch_sample_logs`(
        in message_query  varchar(30)
    )
    BEGIN
        SELECT * FROM new_db.sample_log where message like message_query;
    END
    

    控制器

    @RequestMapping("/logs")
    @RestController
    class SampleLogController {
        private final JdbcTemplate jdbcTemplate;
    
        @Autowired
        SampleLogController(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @GetMapping("/call")
        public Object get() {
            final Map<String, Object> call = jdbcTemplate.call(connection -> {
                CallableStatement cs = connection.prepareCall("{call fetch_sample_logs (?)}");
                cs.setString(1, "%wel%");
                return cs;
            }, Collections.singletonList(new SqlParameter(Types.VARCHAR)));
            return Optional.of(call.getOrDefault("#result-set-1", Collections.emptyList()));
        }
    }
    

    【讨论】:

      【解决方案2】:

      我建议您提取所有结果集并将它们连接在一起。您可以按照其他答案的建议进行操作,然后从 Map 中获取“#result-set-1”,但我建议至少在返回之前将 ResultSet 转换为应用程序表示的对象(“Thing”pojo)道法。我认为将结果集连接在一起可能是一个更持久的解决方案,除非有人能想到为什么不这样做的原因。

      @Autowired
      private JdbcTemplate jdbcTemplate;
      public List<Thing> read(String testParam) {
          List<SqlParameter> parameters = Arrays.asList(new SqlParameter(Types.NVARCHAR));
          CallableStatementCreator csc = new CallableStatementCreator() {
              @Override
              public CallableStatement createCallableStatement(Connection con) throws SQLException {
                  CallableStatement cs = con.prepareCall("{call test (?)}");
                  cs.setString(1, testParam);
                  return cs;
              }
          };
          Map<String, Object> result = jdbcTemplate.call(csc, parameters);
      
          return result.values().stream().map(o -> fromResultSet((ResultSet) o)
                 .flatMap(List::stream).collect(toList());
      
      }
      
      private List<Thing> fromResultSet(ResultSet resultSet) {
          List<Thing> list = new ArrayList<>();
          while (resultSet.next()) {
            Thing thing = new Thing(resultSet.getString("resultCol1"), resultSet.getString("resultCol2")
            list.add(user);
          }
      }
      

      我修改了Resultset To List 中的一些代码来实际解析结果集。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多