【问题标题】:Mapping DTO to Entity with ModelMapper including exceptions使用 ModelMapper 将 DTO 映射到实体,包括异常
【发布时间】:2018-09-20 07:17:11
【问题描述】:

我有一个 DTO (OpeningHoursPeriodDTO) 和一个实体 (OpeningHoursPeriod),我想使用 ModelMapper 对其进行映射。 只要我在转换器方法中没有抛出异常,一切都会按预期正常工作。

这里是转换器的代码:

modelMapper
        .createTypeMap(OpeningHoursPeriodDTO.class, OpeningHoursPeriod.class)
        .setConverter(converter -> {
            OpeningHoursPeriodDTO openingHoursPeriodDTO = converter.getSource();
            if (openingHoursPeriodDTO == null) {
                return null;
            }

            if (openingHoursPeriodDTO.getOpen() == null || openingHoursPeriodDTO.getClose() == null) {
                throw new BadRequestException("Opening hours and closing hours must be present");
            }

            if (!Objects.equals(
                    openingHoursPeriodDTO.getOpen().getDay(),
                    openingHoursPeriodDTO.getClose().getDay())) {
                throw new BadRequestException("Opening and close day for a period must be for the same day");
            }

            return OpeningHoursPeriod.builder()
                    .id(openingHoursPeriodDTO.getId())
                    .day(openingHoursPeriodDTO.getOpen().getDay())
                    .openTime(LocalTime.parse(openingHoursPeriodDTO.getOpen().getTime(), TIME_FORMATTER))
                    .closeTime(LocalTime.parse(openingHoursPeriodDTO.getClose().getTime(), TIME_FORMATTER))
                    .build();
        });

问题是如果它碰巧抛出一个异常,我在我的 Spring Boot 应用程序中得到一个 500 状态码,尽管BadRequestException 的状态码应该是 400。 知道如何最好地处理此类转换器异常吗?

【问题讨论】:

    标签: java spring-boot modelmapper


    【解决方案1】:

    您可以将@ResponseStatus 添加到您的异常中:

    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    public class BadRequestException extends RuntimeException {
    }
    

    抛出此异常时会生成 400。

    但在 REST 控制器中处理异常还有其他各种选项。看看这里:

    https://www.baeldung.com/exception-handling-for-rest-with-spring

    【讨论】:

    • 这正是我在我的 BadRequestException 中所拥有的,但不知何故 ModelMapper 吃了它然后抛出 500
    • 也许异常被包装了。你看到堆栈跟踪了吗?
    • 是的。我的例外是通过org.modelmapper.MappingException
    • 那么你应该使用 ControllerAdvice 并处理 MappingException 然后检查原因并在它是 BadRequestException 时返回 400: 4. 新解决方案 3 – 新 @ControllerAdvice(Spring 3.2 及更高版本)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多