今天刚搭建的SpringBoot工程测试时发现使用@RestController注解的controller里的方法返回信息报错,代码如下:
@RestController
@RequestMapping("/swagger")
@Api(value = "Swagger2 在线接口文档")
public class TestController {
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
@ApiOperation(value = "根据用户唯一标识获取用户信息")
@ApiParam(value = "用户唯一标识", name = "id")
public JsonResult<User> getUserInfo(@PathVariable Long id) {
// 模拟数据库中根据id获取User信息
User user = new User(id, "倪升武", "123456");
JsonResult<User> userJsonResult = new JsonResult<>(user);
return userJsonResult;
}
}
响应信息如下:
{
"timestamp": "2020-04-23T09:23:20.522+0000",
"status": 500,
"error": "Internal Server Error",
"message": "No converter found for return value of type: class com.example.demo.bean.JsonResult",
"path": "/swagger/get/66666"
}
开始很纳闷,加上@RestController注解后不就相当于使用了@Controller和@ResponseBody这两个
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
仔细排查发现我写的JsonResult实体类中,少了getter、setter方法
public class JsonResult<T> {
private T data;
private String code;
private String msg;
/**
* 有数据返回,状态码为0,人为指定提示信息
* @param data
* @param msg
*/
public JsonResult(T data, String msg) {
this.data = data;
this.code = "0";
this.msg = msg;
}
}
万物必有规律,哈哈