java - 重写 Mapper 类或客户映射器或属性映射中的方法 - Spring Boot

标签 java spring-boot mapstruct

我有以下 DTO、Entity、Mapper 类,它们将值保留在数据库中。我在日期列的其中一个属性中遇到问题。我输入“DD-MM-yyyy”格式的字符串。然而,它在映射器类中失败,说它是一个无法解析的日期。我不确定为什么编译时生成的类中没有默认日期格式

数据库结构

enter image description here 数据传输对象

public class CcarRepWfInstDTO implements Serializable {

private Long id;

private Long reportId;

private Long workflowInstanceId;

private String cobDate;

private String frequency;

private String runType;

private String reportVersion;

private String workflowStatus;

}

实体

@Data
@Entity(name = "CcarReportWorkflowInstance")
@Table(name = "CCAR_REPORT_WORKFLOW_INSTANCE")
public class CcarReportWorkflowInstance implements Serializable {
private static final long serialVersionUID = 1L;

@SequenceGenerator(name = "CCAR_REPORT_WORKFLOW_INSTANCESEQ", sequenceName = "SEQ_CCAR_REPORT_WF_INST_ID", allocationSize = 1)
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CCAR_REPORT_WORKFLOW_INSTANCESEQ")
private Long id;

@Column(name = "WORKFLOW_INSTANCE_ID", nullable = false)
private Long workflowInstanceId;

@Column(name = "COB_DATE", nullable = false)
@Temporal(TemporalType.DATE)
private Date cobDate;

@Column(name = "FREQUENCY", nullable = false)
private String frequency;

@Column(name = "RUN_TYPE", nullable = false)
private String runType;

@Column(name = "REPORT_VERSION", nullable = false)
private String reportVersion;

@Column(name = "TERMINATION_STATUS", nullable = false)
private String terminationStatus;

@Version
@Column(name = "VERSION", columnDefinition = "integer DEFAULT 0", nullable = false)
private Long version = 0L;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "REPORT_ID", nullable = false, insertable = false, updatable = false)
private CcarReport ccarReport;

@Column(name = "REPORT_ID")
private Long reportId;

编译时生成的映射器实现类的片段失败并返回错误,指出无法解析的日期

    @Override
 public CcarReportWorkflowInstance ccarRepWfInstDTOToCcarRepWfInst(CcarRepWfInstDTO ccarRepWfInstDTO) {
    if ( ccarRepWfInstDTO == null ) {
        return null;
    }

    CcarReportWorkflowInstance ccarReportWorkflowInstance = new CcarReportWorkflowInstance();

    ccarReportWorkflowInstance.setId( ccarRepWfInstDTO.getId() );
    ccarReportWorkflowInstance.setWorkflowInstanceId( ccarRepWfInstDTO.getWorkflowInstanceId() );
    if ( ccarRepWfInstDTO.getCobDate() != null ) {
        try {
            ccarReportWorkflowInstance.setCobDate( new SimpleDateFormat().parse( ccarRepWfInstDTO.getCobDate() ) );
        }
        catch ( ParseException e ) {
            throw new RuntimeException( e );
        }
    }
    ccarReportWorkflowInstance.setFrequency( ccarRepWfInstDTO.getFrequency() );
    ccarReportWorkflowInstance.setRunType( ccarRepWfInstDTO.getRunType() );
    ccarReportWorkflowInstance.setReportVersion( ccarRepWfInstDTO.getReportVersion() );
    ccarReportWorkflowInstance.setReportId( ccarRepWfInstDTO.getReportId() );

    return ccarReportWorkflowInstance;
}

服务层中的代码使用映射器类并失败

private void persistWfInst(CcarRepWfInstDTO ccarRepWfInstDTO) {

    try {
        ccarRepWfInstDTO.setWorkflowInstanceId(ccarRepWfInstDTO.getWorkflowInstanceId());
        CcarReportWorkflowInstance ccarReportWorkflowInstance = ccarRepWfInstMapper.ccarRepWfInstDTOToCcarRepWfInst(ccarRepWfInstDTO);
        ccarRepWfInstRepository.save(ccarReportWorkflowInstance);
    } catch (Exception e) {
        log.info("Exception while saving workflow instance information =" + e);
        throw new CustomParameterizedException(e.getMessage());
    }
}

服务层中的自定义代码,不使用映射器,它使用显式定义的简单日期格式,工作正常。请告知如何解决此问题并使用 Spring boot 方式堆栈,因为我的整个应用程序都是围绕它设计的。如果我不使用默认提供的映射器类和实现,那就不好了。

private void persistWfInst(CcarRepWfInstDTO ccarRepWfInstDTO) {

    try {
        ccarRepWfInstDTO.setWorkflowInstanceId(ccarRepWfInstDTO.getWorkflowInstanceId());
        CcarReportWorkflowInstance ccarReportWorkflowInstance = new CcarReportWorkflowInstance();
        ccarReportWorkflowInstance.setId(ccarRepWfInstDTO.getId());
        ccarReportWorkflowInstance.setWorkflowInstanceId(ccarRepWfInstDTO.getWorkflowInstanceId());
        if (ccarRepWfInstDTO.getCobDate() != null) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat("DD-MM-yyyy");
                ccarReportWorkflowInstance.setCobDate(sdf.parse(ccarRepWfInstDTO.getCobDate()));
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
        ccarReportWorkflowInstance.setFrequency(ccarRepWfInstDTO.getFrequency());
        ccarReportWorkflowInstance.setRunType(ccarRepWfInstDTO.getRunType());
        ccarReportWorkflowInstance.setReportVersion(ccarRepWfInstDTO.getReportVersion());
        ccarReportWorkflowInstance.setReportId(ccarRepWfInstDTO.getReportId());
        ccarRepWfInstRepository.save(ccarReportWorkflowInstance);
    } catch (Exception e) {
        log.info("Exception while saving workflow instance information =" + e);
        throw new CustomParameterizedException(e.getMessage());
    }
}

最佳答案

映射逻辑缺少日期格式。这可以在 mapstruct 中定义,如下所示:

@Mapping(target = "cobDate", source = "cobDate", dateFormat = "DD-MM-yyyy")
CcarReportWorkflowInstance convert(CcarRepWfInstDTO ccarRepWfInstDTO);

关于java - 重写 Mapper 类或客户映射器或属性映射中的方法 - Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38591714/

相关文章:

java - 我们可以以线程安全的方式从方法返回 Function 吗?

java - 扩展类中的方法不起作用

Java websocket 服务器给出 404

java - 如何在maven java springboot中使用Starter Data Elasticsearch 3.0.1配置elasticsearch 8.5.3中的安全性

java - MapStruct:如何过滤要使用的后映射方法?

java - 以下 java 代码给出输出 1 2 3 。代码是如何执行的?

java - Spring Boot - 使用RestControllerAdvice的全局自定义异常处理机制

java - Spring Boot webservice JDBC偶尔无法获得连接

java - 当目标具有与源同名的变量时,使用自定义源和目标变量的 @Mapping 无法按预期工作

java - 将 java MapStruct 与 VSCode 结合使用