当前位置: 首页 > 知识库问答 >
问题:

Spring Boot rest控制器:如何返回干净的json

漆雕育
2023-03-14

我将这个方法设置为从Spring Boot rest控制器返回一个响应:

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: [ {…}, {…} ]

当我期待有:

[ {…}, {…} ]

为什么将结果集插入到< code>#result-set-1键中?我如何改变这种行为?

共有2个答案

席波娃
2023-03-14

我建议你提取所有结果集并将它们连接在一起。你可以按照另一个答案的建议去做,从Map中获取“#result-set-1”,但我建议在从dao方法返回之前,至少将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到List的一些代码,以便实际解析结果集。

郜光明
2023-03-14

< code>JdbcTemplate#call返回映射

我是这样做的:

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

控制器

java prettyprint-override">@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()));
    }
}
 类似资料:
  • 问题内容: 我正在尝试从WCF服务返回一些JSON。该服务仅从我的数据库返回一些内容。我可以得到数据。但是,我担心JSON的格式。当前,返回的JSON格式如下: 实际上,我希望JSON的格式尽可能整洁。我相信(我可能是不正确的),以干净的JSON表示的相同结果集应如下所示: 我不知道“ d”来自哪里。我也不知道为什么要插入转义字符。我的实体如下所示: 负责返回内容的服务定义为: 如何从WCF服务返

  • 问题内容: 我擅长进行干净,隔离良好的单元测试。但是我在这里的“干净”部分碰巧测试一个控制器,该控制器使用功能获取实体作为其映射方法的参数。 像这样定义控制器 因此,从小型文档中,我知道它用于查找实体。我想知道的是如何在测试中清晰地进行模拟。通过执行以下步骤,我取得了一些成功: 创建一个我可以模拟的自定义转换器/格式化程序 使用上述转换器实例化我自己的MockMvc 重置模拟并在每次测试时更改行为

  • 我有三个java8 Optionals,并希望以首选顺序返回实际存在的任何一个。似乎应该有一种简单的方法可以像这样链接它们: 如果这三个都为空,那么应该返回一个。 现有的orElse和orElseGet不能真正胜任这项任务-它们必须返回一个实际值,因此剩余的回退不可能是Optionals本身。 在最坏的情况下,我可能会有一长串ifPresent()检查,但似乎有更好的方法来处理它?

  • 目标是打印标签的当前文本。标签在整个程序中不断变化,使用当前的方法,我只能检索标签的初始化值。 我用来检索控制器实例的内容:

  • 问题内容: 我已经使用以下命令从Docker文件构建了一个Docker映像。 当我尝试使用同一命令重建它时,它正在使用构建缓存,例如: 缓存显示已安装Aerospike。但是,我在从该图像生成的容器中找不到它,因此我想在不使用缓存的情况下重建该图像。如何强制Docker在没有缓存的情况下重建干净的映像? 问题答案: 有一个选项: 在较旧的Docker版本中,您需要通过,但情况不再如此。

  • 你好,我是拉威尔的新手,也许这对你们来说太傻了。在laravel 8中,路由web。php我创建了一条如下的路线: 我想问的是,我们也可以从回调视图返回控制器吗?所以在路由 /editprofile中,第二个参数不是'App\Http\Controller\SiteController@edit_profile',而是一个回调函数,如路由'/home'。 但是它返回错误哈哈。假设我不想用__con