使用DTO发布方法

时间:2018-12-01 19:35:45

标签: java hibernate spring-boot dto

我想使用DTO与Angular通信,但实际上它不起作用。我想创建POST请求,以使用Dto模型将数据从应用程序添加到数据库中。

您可以在图片上看到我的错误: enter image description here

enter image description here

我的班级客户:

@Entity
@Table(name = "customer")
public class Customer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(name = "name")
private String name;

@OneToMany
private List<Ticket> ticket;
...

CustomerDto类:

public class CustomerDto {
private String name;
private List<TicketDto> ticket;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public List<TicketDto> getTicket() {
    return ticket;
}

public void setTicket(List<TicketDto> ticket) {
    this.ticket = ticket;
}
}

CustomerController类:

@Autowired
CustomerService customerService;

@PostMapping(value = "/customers/create")
public Customer postCustomer(@RequestBody CustomerDto customerDto, List<TicketDto> ticketDtos) {
    //ArrayList<TicketDto> tickets = new ArrayList<>();
    ticketDtos.add(customerDto.getName());
    ticketDtos.add(customerDto.getTicket());
    Customer _customer = customerService.save(new Customer(customerDto.getName(), ticketDtos ));
    return _customer;
}

CustomerService:

public interface CustomerService {

void save(CustomerDto customerDto, List<TicketDto> ticketDtos);
}

CustomerServiceImpl:

@Service
public class CustomerServiceImpl implements CustomerService {

@Autowired
CustomerRepository repository;

@Override
public void save(CustomerDto customerDto, List<TicketDto> ticketDtos) {
    Customer customer = new Customer();
    customer.setName(customerDto.getName());
    customer.setTicket(customerDto.getTicket());

    List<Ticket> tickets = new ArrayList<>();
    for (TicketDto ticketDto : ticketDtos) {
        Ticket ticket = new Ticket();
        ticket.setDestinationCity(ticketDto.getDepartureCity());
        ticket.setDestinationCity(ticketDto.getDestinationCity());
        tickets.add(ticket);
    }
}

2 个答案:

答案 0 :(得分:1)

由于CustomerServiceImpl接受了CustomerDto和TicketDtos列表,因此您需要如下更改控制器上的方法调用:

CustomerController类:

@Autowired
CustomerService customerService;

@PostMapping(value = "/customers/create")
public Customer postCustomer(@RequestBody CustomerDto customerDto) {
    Customer _customer = customerService.save(customerDto));
    return _customer;
}

并将CustomerServiceImpl更新为:

@Service
public class CustomerServiceImpl implements CustomerService {

    @Autowired
    CustomerRepository repository;

    // change save to return saved customer
    @Override
    public Customer save(CustomerDto customerDto) {
        Customer customer = new Customer();
        customer.setName(customerDto.getName());
        // customer.setTicket(customerDto.getTicket()); // remove this

        List<Ticket> tickets = new ArrayList<>();
        for (TicketDto ticketDto : customerDto.getTicketDtos) {
            Ticket ticket = new Ticket();
            ticket.setDestinationCity(ticketDto.getDepartureCity());
            ticket.setDestinationCity(ticketDto.getDestinationCity());
            tickets.add(ticket);
        }
        customer.setTickets(tickets); // add this to set tickets on customer
        return repository.save(customer);
    }

显然,您还需要更改界面:

public interface CustomerService {

     Customer save(CustomerDto customerDto);
}

答案 1 :(得分:0)

对于实体-DTO 转换,我们需要使用ModelMapperma​​pstruct 库。 借助这些库,我们可以轻松地从 Dto 转换为实体,将实体转换为 dto 对象。添加任何依赖后,我们就可以使用它了。

我们如何使用,让我们看看...

在 spring 配置中定义 modelMapper bean。

@Bean
public ModelMapper modelMapper() {
    return new ModelMapper();
}

假设我们需要将 List 转换为 List obj 那么我们可以简单地执行:

List<TicketDto> ticketDtos = .... //Suppose It is holding some data
List<Ticket> tickets = ticketDtos.stream()
                       .map(tkt-> mappper.map(tkt, ticket.class))
                       .collect(Collectors.toList());

使用起来非常简单,比如ma​​ppper.map(targetClass, DestinationClass.class) 我在这里使用了 Java8 代码,但您可以使用任何人。希望对你有帮助。