首页 > 解决方案 > 在 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
} 

标签: javajsonspringjackson

解决方案


推荐阅读