java - 在 Java Spring 框架中使用 Rest 控制器反序列化接口
问题描述
我继承了一个足够简单的控制器。问题是它返回接口,如果不能实例化,Spring AFAIK 就不能反序列化。我可以在(每个)传输接口上使用一个注释来修复它,但它消除了返回接口而不是具体类的任何好处,并且超出了 DTO 职责的范围。
因此我的问题是可以在客户端做一些事情来消费控制器吗?如果没有,是否可以在不更改接口的情况下对控制器代码执行某些操作?UserDto
这是休息控制器:
@RestController
@RequestMapping(value = "/user")
public class UserController {
// ...
@RequestMapping(value = "/create", method = RequestMethod.POST)
public UserDto create(@RequestBody UserDto user) throws ServiceException {
return service.save(user);
}
// ...
}
这是充当客户端并使用控制器的测试:
@Test
public void UserControllerRealTest() {
ClientUser user1 = new ClientUserImpl("ADSMarko", "Marko Savić", "Slayer!!!");
RestTemplate rt = new RestTemplate();
HttpEntity<ClientUser> request = new HttpEntity<>(user1);
UserDto result1 = rt.postForObject(createUrl, request, UserDtoImpl.class);
System.out.println("User " + result1.getUsername() + " saved with id " + result1.getId());
ClientUser user2 = new ClientUserImpl("Marko", "Marko Savić", "Slayer!!!");
request = new HttpEntity<>(user2);
ParameterizedTypeReference<UserDto> ptr = new ParameterizedTypeReference<UserDto>() {};
ResponseEntity<UserDto> re = rt.exchange(createUrl, HttpMethod.POST, request, ptr);
UserDto result2 = re.getBody();
System.out.println("User " + result2.getUsername() + " saved with id " + result2.getId());
}
波纹管是有问题的界面。它适用于前导注释,但没有它会抛出com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
@JsonDeserialize(as = UserDtoImpl.class) // Or the longer annotation
public interface UserDto {
// ... just getters and setters
}
解决方案
推荐阅读
- flutter - 让 EditableText 换行它的文本
- powershell - 如何减去对象属性中的特定值?
- python - Python - Web Scraping:TypeError:字符串索引必须是整数
- javascript - 在 AngularJS 1.5 中使用异步服务
- three.js - 三.js纹理优化方法
- html - 粘性导航栏消失
- compression - 是否可以无损失地压缩单个字节?
- javascript - AngularJS:为什么在我的 ES6 控制器中未定义 $scope?
- java - Apache Flink 中保存的默认检查点在哪里?
- docker - 在 docker-compose down 之前备份 Mysql DB