java - 参数值 [{}] 与预期类型不匹配 [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;
}
解决方案
推荐阅读
- python - 将 timedelta 的时间转换/使用为 datetime
- python - try/except 子句和数值范围条件
- spring - 代理 Vaadin Spring Boot 应用程序和 URL 问题
- swift - 这是 UITextView 透明度错误吗?
- android - 如何将图标添加到 android:drawable 文件夹中?
- angular - Validators.email 指令无法正常工作
- angular - 视频结束时,HTML5 视频“结束”事件有时不会触发
- c# - 为什么我的 ASP.NET 核心应用程序仅在 PUT 调用时中断?
- python - 在python中提取每行的话语
- javascript - 如何检测画布内的元素?