首页 > 解决方案 > 我有关于构造函数(Spring boot 和 Vaadin)

问题描述

打开调试器时我的项目出错

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.example.vaadin.DTO.ContactInfo]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.vaadin.DTO.ContactInfo` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

我的项目,一些课程。似乎他正确地编写了所有内容,获得了必要的注释,但是他给了我一个错误,并通过了调试器。可以看一下代码,可能是项目中写错了什么。我想在界面中显示域信息

我的代码

@Data
@AllArgsConstructor
public class ContactInfo {
    private String handle;
    private String name;
    private String voice;
    private String fax;
    private String email;
}

主视图

@Route
@Service
public class MainView extends VerticalLayout {

    RestTemplate restTemplate = new RestTemplate();

    public String URL() {
        return "http://localhost:8080/api/whois";
    }

    private ResponseEntity<DomainDTO> domainDTO(String url, Request request) {
//        return restTemplate.postForObject(url, request, DomainDTO.class);
        ResponseEntity<DomainDTO> domainDTOResponseEntity = restTemplate.postForEntity(url, request, DomainDTO.class);
        System.out.println(">>>>>>>>>>>>>>>" + domainDTOResponseEntity); ///////////////////////
        return domainDTOResponseEntity;
    }

    public MainView() {
        FormLayout formLayout = new FormLayout();
        TextField textField = new TextField();
        textField.setPlaceholder("please input domain");
        textField.setWidth("630px");
        textField.setHeight("50px");
        Text text1 = new Text("");
        VerticalLayout v1 = new VerticalLayout();
        v1.add(text1);
        Button button = new Button("SHOW");

        button.addClickListener(event -> {
                    DomainDTO dto = domainDTO(URL(), new Request(textField.getValue())).getBody();
                    text1.setText(report(dto));
                }
        );

        button.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        formLayout.addFormItem(textField, "DOMAIN");
        button.setWidth("30%");
        formLayout.addFormItem(button, " ");
        add(formLayout, v1);
    }

    private String report(DomainDTO dto) {
        StringBuffer sb = new StringBuffer();
        sb
                .append("Domain Name............: ").append(dto.getDomainInfo().getDomainName()).append(System.lineSeparator())
                .append(System.lineSeparator())
                .append("Organization Using Domain Name").append(System.lineSeparator())
                .append("Name...................: ").append(dto.getDomainInfo().getName()).append(System.lineSeparator())
                .append("Organization Name......: ").append(dto.getDomainInfo().getOrganizationName()).append(System.lineSeparator())
                .append("Street Address.........: ").append(dto.getDomainInfo().getStreetAddress()).append(System.lineSeparator())
                .append("City...................: ").append(dto.getDomainInfo().getCity()).append(System.lineSeparator())
                .append("State..................: ").append(dto.getDomainInfo().getState()).append(System.lineSeparator())
                .append("Postal Code............: ").append(dto.getDomainInfo().getPostalCode()).append(System.lineSeparator())
                .append("Country................: ").append(dto.getDomainInfo().getCountry()).append(System.lineSeparator())
                .append(System.lineSeparator())
                .append("Administrative Contact/Agent").append(System.lineSeparator())
                .append("Nick Handle............: ").append(dto.getContactInfo().getHandle()).append(System.lineSeparator())
                .append("Phone Number...........: ").append(dto.getContactInfo().getVoice()).append(System.lineSeparator())
                .append("Fax....................: ").append(dto.getContactInfo().getFax()).append(System.lineSeparator())
                .append("Email Address..........: ").append(dto.getContactInfo().getEmail()).append(System.lineSeparator())
                .append(System.lineSeparator())
                .append("Nameserver in listed order").append(System.lineSeparator())
                .append(System.lineSeparator());

        dto.getHostInfo().forEach(hInfo -> sb
                .append("Server.................: ").append(hInfo.getName()).append(System.lineSeparator())
                .append("Ip address.............: ").append(hInfo.getIpaddr()).append(System.lineSeparator())
                .append(System.lineSeparator())
        );

        sb.append(System.lineSeparator());

        dto.getStatusInfo().forEach(sInfo -> sb
                .append("Domain created: ").append(sInfo.getCreated()).append(System.lineSeparator())
                .append("Last modified: ").append(sInfo.getUpdated()).append(System.lineSeparator())
                .append("Domain status: ").append(sInfo.getStatus()).append(System.lineSeparator())
                .append("Registrar created: ").append(sInfo.getRegistarcr()).append(System.lineSeparator())
                .append("Current Registrar: ").append(sInfo.getRegistrar()).append(System.lineSeparator())
                .append(System.lineSeparator())
        );

        return sb.toString();
    }
}

域DTO

@Data
@AllArgsConstructor
public class DomainDTO {
    private DomainInfo domainInfo;
    private ContactInfo contactInfo;
    private List<HostInfo> hostInfo;
    private List<StatusInfo> statusInfo;




}

应用配置

@Configuration
public class AppConfig {

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

标签: javaspringspring-bootvaadin

解决方案


您还需要在 ContactInfo 和 DomainDTO 类中的 @AllArgsConstructor 之后添加注释 @NoArgsConstructor


推荐阅读