我在使用自定义转换器时遇到了麻烦,这是在spring data REST
项目中(无控制器应用程序和严格的Java配置)。
我有两个实体,一个是员工(Employee),另一个是州(State),它们之间的关系是@ManyToOne,相信我们都知道。然而,问题在于将state
字段(字段名为state)从String
转换为State
对象,并将其setState()
到Employee
类中以便持久化到数据库中。
package com.hr.domain;
@Entity
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "state_id", nullable = true)
private Long id;
private String firstname;
private State state;
@StateConverter
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "employee_state_id_fk", nullable = false, insertable = true, updatable = true)
private State state;
//GETTERS AND SETTERS
public String getFirstname() {
return firstname();
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getState() {
return state();
}
public void setState(State state) {
this.state = state;
}
//HASHCODES AND EQUALS
}
package com.hr.domain;
@Entity
public class State implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "state_id", nullable = true)
private Long id;
private String state_name;
//GETTERS AND SETTERS
//TO STRING
@Override
public String toString() {
return "State [id=" + id + ", state_name=" + state_name + "]";
}
}
我已经将转换器注册到转换服务中,但仍然无法在表单提交时将字符串转换为状态对象。
@Bean//(name="conversionService")
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(getConverters());
bean.afterPropertiesSet();
ConversionService object = bean.getObject();
System.out.println(object);
return object;
}
private Set<Converter> getConverters() {
Set<Converter> converters = new HashSet<Converter>();
converters.add(new StringToStateTypeConverter());
return converters;
}
这是我的状态转换器(StateConverter)。
@Component
@StateConverter
public class StringToStateTypeConverter implements Converter<String, State> {
@Autowired
StateRepository repository;
public State convert(String source) {
return repository.findOne(new Long(source));
}
}
提交时,我收到了以下错误:
Caused by: org.springframework.core.convert.ConversionFailedException: 无法将值“AB”从类型java.net.URI转换为类型com.hr.domain.State;
感谢任何形式的帮助。
愿原力与你同在。 敬礼。
以下是错误追踪信息
17:21:29,975 ERROR [org.springframework.data.rest.webmvc.AbstractRepositoryRestController] (default task-13) Could not read JSON: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable. (through reference chain: com.hr.domain.Employee["State"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable. (through reference chain: com.hr.domain.Employee["State"]): org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable. (through reference chain: com.hr.domain.Employee["State"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable. (through reference chain: com.hr.domain.Employee["State"])
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228) [spring-web-4.0.5.RELEASE.jar:4.0.5.RELEASE]
...........
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable. (through reference chain: com.hr.domain.Employee["State"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232) [jackson-databind-2.3.3.jar:2.3.3]
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197) [jackson-databind-2.3.3.jar:2.3.3]
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB'; nested exception is java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable.
at org.springframework.data.rest.core.UriToEntityConverter.convert(UriToEntityConverter.java:106) [spring-data-rest-core-2.1.0.RELEASE.jar:]
at org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$UriStringDeserializer.deserialize(PersistentEntityJackson2Module.java:359) [spring-data-rest-webmvc-2.1.0.RELEASE.jar:]
Caused by: java.lang.IllegalArgumentException: Cannot resolve URI AB. Is it local or remote? Only local URIs are resolvable.
... 94 more
AB
? - Serge Ballesta