我正在使用 Spring Boot 2.4.5、MyBatis 3.5.6 和 Java 8。當嘗試從 a 回傳字串@RestController時,回傳的HttpErrorResponse.
該方法嘗試通過 MyBatis 獲取值,即 DAO 物件中充當@Mapper.
我的控制器方法:
@RestController
@RequestMapping("/api/myAPI")
public class MyController{
@Resource
private MyService service;
@GetMapping(value = "myString")
public String getBillingCompany() {
return this.service.getDAO().getMyString();
}
}
我的道:
@Repository
@Mapper
public interface MyDAO{
String getMyString();
}
...和 ??MyBatis 映射器:
<mapper namespace="com.package.MyDAO">
<select id="getMyString" resultType="String">
SELECT 'My desired result' FROM A_TABLE
</select>
...
</mapper>
HttpErrorResponse:
HttpErrorResponse: {
"headers": {
"normalizedNames": {},
"lazyUpdate": null
},
"status": 200,
"statusText": "OK",
"url": "http://localhost:4200/api/myAPI/myString",
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure during parsing for http://localhost:4200/api/myAPI/myString",
"error": {
"error": { SyntaxError: Unexpected number in JSON at position 2
at JSON.parse (<anonymous>)
at XMLHttpRequest.onLoad (http://localhost:4200/vendor.js:18158:51)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:21266:35)
at Object.onInvokeTask (http://localhost:4200/vendor.js:74037:33)
at ZoneDelegate.push../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:21265:40)
at Zone.push../node_modules/zone.js/dist/zone.js.Zone.runTask (http://localhost:4200/polyfills.js:21033:51)
at ZoneTask.push../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (http://localhost:4200/polyfills.js:21348:38)
at invokeTask (http://localhost:4200/polyfills.js:22516:18)
at XMLHttpRequest.globalZoneAwareCallback (http://localhost:4200/polyfills.js:22553:25)
},
"text": "My desired result"
}
}
盡管如此,如果我要求控制器和 DAO 方法回傳一個int,它都可以完美地作業。
因此,我懷疑該問題與非原始型別“命名空間”有關,因此我嘗試typeAlias在 MyBatis 配置中設定 a ,但無濟于事:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="java.lang.String" alias="String"/>
</typeAliases>
</configuration>
無論如何,我的印象是 MyBatis 和 Spring 應該已經足夠聰明,知道 aString是什么。過去我已經成功回傳了物件(Maps 和Lists)和 POJO 的集合。
關于我缺少或沒有看到的任何想法?提前致謝。
編輯:
到目前為止,唯一對我有用的東西與@emeraldjava 提出的類似。我在依賴項中的現有包裝器上構建了一個包裝器,data在我的前面獲取:
@RestController
@RequestMapping("/api/myAPI")
public class MyController{
@Resource
private MyService service;
@GetMapping(value = "myString")
public Result<String> getBillingCompany() {
return new Result<>(this.service.getDAO().getMyString());
}
}
public class Result<T> extends ServiceResult {
public Result(T data) {
this.setData(data);
}
}
依賴項中已經存在的包裝器:
public class ServiceResult {
private Object data;
...
public void setData(Object data) {
this.data = data;
}
public Object getData() {
return this.data;
}
}
uj5u.com熱心網友回復:
我認為問題在于您查詢的表有多行,因此您的查詢結果將是一個字串串列,每個元素都包含“我想要的結果”,其中串列的大小等于表中的行數。為了強制單個結果,只需將查詢更改為:
<select id="getMyString" resultType="String">
SELECT MAX('My desired result') FROM A_TABLE
</select>
uj5u.com熱心網友回復:
我建議您將 Controller 方法更新為包裝字串的 ResponseEntity。
@RestController
@RequestMapping("/api/myAPI")
public class MyController{
@Resource
private MyService service;
@GetMapping(value = "myString")
public ResponseEntity getBillingCompany() {
return new ResponseEntity<Object>(this.service.getDAO().getMyString(), HttpStatus.OK);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/390003.html
