首页 > 解决方案 > 参数值 [{}] 与预期类型不匹配 [java.lang.String (n/a)]

问题描述

我收到错误“参数值 [{}] 与预期类型 [java.lang.String (n/a)] 不匹配;嵌套异常是 java.lang.IllegalArgumentException”

实体:

public class Job implements Serializable {

    @NotNull
    @Column(name = "args", nullable = false)
    private String args;



DTO:

public class JobDTO implements Serializable {

    @NotNull
    private JSONObject  args;

存储库:

@SuppressWarnings("unused")
@Repository
public interface JobRepository extends JpaRepository<Job, Long> {

    Job getByActionAndStatusAndCertificateInstanceIdAndAgentIdAndArgs(JobActions jobActions ,JobStatus jobStatus, Long certificateInstanceID, Long agentId, JSONObject args) ;

}

服务 :

    /**
     * 
     * @param dayBeforeExpiration
     * @return
     */
    public List<Certificate> getExpiredCertificatesList(Long dayBeforeExpiration) {
        JSONObject args = new JSONObject(); 
        List<Certificate> certificates = extendedCertificateRepository.findExpiredCertificates(dayBeforeExpiration);
        for (Certificate certificate : certificates) {
            List<CertificateInstance> certificateInstances = extendedCertificateInstanceRepository
                    .findCertificateInstancesByCertId(certificate);
            for (CertificateInstance certificateInstance : certificateInstances) {
                extendedCertificateRequestService.createJob(certificate.getAgent().getId(), certificateInstance.getId(),
                        JobActions.RENEW, args );

            }
        }

        return certificates;
    } 


    public JobDTO createJob(Long agentId, Long certificateInstanceId, JobActions action , JSONObject args ) {

        JobDTO jobDTO = new JobDTO();
        jobDTO.setAgentId(agentId);
        jobDTO.setCertificateInstanceId(certificateInstanceId);
        jobDTO.setAction(action);
        jobDTO.setStatus(JobStatus.PENDING);
        jobDTO.setArgs(args);
        return jobService.save(jobDTO);

    }



     * @param jobDTO the entity to save
     * @return the persisted entity
     */
    public JobDTO save(JobDTO jobDTO) {
        log.debug("Request to save Job : {}", jobDTO);
        if(extendedJobService.ckeckIsRenewJobExist(jobDTO)){
            return jobMapper.toDto(jobRepository.getByActionAndStatusAndCertificateInstanceIdAndAgentIdAndArgs(jobDTO.getAction(), jobDTO.getStatus(), jobDTO.getCertificateInstanceId(),
                jobDTO.getAgentId() , jobDTO.getArgs())) ;
        }
     Job job = jobMapper.toEntity(jobDTO);
       JobDTO result = jobMapper.toDto(job);
        jobSearchRepository.save(job);
        return result;
    }

作业映射器

@Mapper(componentModel = "spring", uses = {AgentMapper.class, CertificateInstanceMapper.class, ExtJobMapper.class})
public interface JobMapper extends EntityMapper<JobDTO, Job> {

    @Mapping(source = "agent.id", target = "agentId")
    @Mapping(source = "certificateInstance.id", target = "certificateInstanceId")
    JobDTO toDto(Job job);

    @Mapping(source = "agentId", target = "agent")
    @Mapping(source = "certificateInstanceId", target = "certificateInstance")
    Job toEntity(JobDTO jobDTO);



    default Job fromId(Long id) {
        if (id == null) {
            return null;
        }
        Job job = new Job();
        job.setId(id);
        return job;
    }
}

ExtJobMapper :将 json 对象转换为字符串并插入它

public interface ExtJobMapper {


    @Mapping(source = "org.json.JSONObject" , target ="java.lang.String")
    static java.lang.String mapJSONToString(org.json.JSONObject value) throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        String jsonString = mapper.writeValueAsString(value) ; 

        return jsonString ;
    }

    @Mapping(source = "java.lang.String" , target ="org.json.JSONObject")
    static  org.json.JSONObject mapStringToJson(java.lang.String value) throws JsonProcessingException {

        JSONObject convertedObject = new Gson().fromJson(value, JSONObject.class);


        return convertedObject ;
    }

}

编辑 JobService args 对象通过调用 toString 方法隐式转换为 String 值但同样的问题

    public JobDTO save(JobDTO jobDTO) {
        log.debug("Request to save Job : {}", jobDTO);
        if(extendedJobService.ckeckIsRenewJobExist(jobDTO)){
            return jobMapper.toDto(jobRepository.getByActionAndStatusAndCertificateInstanceIdAndAgentIdAndArgs(jobDTO.getAction(), jobDTO.getStatus(), jobDTO.getCertificateInstanceId(),
                jobDTO.getAgentId() , jobDTO.getArgs())) ;
        }
        Job job = new Job(jobDTO.getAction(),jobDTO.getArgs().toString(),jobDTO.getStatus(), agentRepository.getOne(jobDTO.getAgentId()), certificateInstanceRepository.getOne(jobDTO.getCertificateInstanceId())) ;
        job = jobRepository.save(job);

        JobDTO result = new JobDTO(job.getAction(), new JSONObject(job.getArgs()),job.getStatus(), job.getAgent().getId(),
        job.getCertificateInstance().getId()) ;
        jobSearchRepository.save(job);
        return result;
    }

标签: javajsonservicedtomapper

解决方案


推荐阅读