Я получаю сообщение об ошибке "Значение параметра [{}] не соответствует ожидаемому типу [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;
}
JobMapper
@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 ;
}
}
edit JobService Объект args неявно преобразуется в значение String путем вызова метод toString, но та же проблема
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;
}