[英]Spring Data Rest Field converter
I am having a hard time using my custom converters on spring data REST project (controller free application and strictly java configuration). 我很难在spring数据REST项目(控制器免费应用程序和严格的java配置)上使用我的自定义转换器。
I have two Entities, an Employee and a State. 我有两个实体,一个员工和一个州。 The relationship is @ManyToOne, I am sure we all know that.
这种关系是@ManyToOne,我相信大家都知道。 Anyway, the problem is converting the
state
field (field name is state) from String
to a State
object and setState()
in the Employee
class for persistence to a database. 无论如何,问题是转换
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 + "]";
}
}
I have registered my converter with the conversion service but still cant get the String to be converter to State object on form submit. 我已经使用转换服务注册了我的转换器,但仍然无法在表单提交时将String转换为State对象。
@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;
}
This is my StateConverter 这是我的StateConverter
@Component
@StateConverter
public class StringToStateTypeConverter implements Converter<String, State> {
@Autowired
StateRepository repository;
public State convert(String source) {
return repository.findOne(new Long(source));
}
}
On submission, I get this error: 提交时,我收到此错误:
Caused by: org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.net.URI to type com.hr.domain.State for value 'AB';
由以下原因引起:org.springframework.core.convert.ConversionFailedException:无法从类型java.net.URI转换为输入值为'AB'的com.hr.domain.State;
Any form of help will be appreciated. 任何形式的帮助将不胜感激。
May the force be with you Regards. 愿力量与你同在。
Here is the Error trace 这是错误跟踪
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
You a registering a new ConversionService
. 您注册了一个新的
ConversionService
。 It replaces the default one that spring registers by default with a lot of converters that are generally assumed to be present. 它取代了默认情况下弹簧注册的默认值,通常假定存在许多转换器。 And you create a new converter instead of using your configured bean.
并且您创建了一个新的转换器,而不是使用您配置的bean。 You should instead :
你应该改为:
Your conversion service initialization could look like : 您的转换服务初始化可能如下所示:
private @Autowired StringToStateTypeConverter stringToStateTypeConverter;
@Bean//(name="conversionService")
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new DefaultFormattingConversionService();
bean.addConverter(String.class, State.class, stringToStateTypeConverter);
return bean;
}
EDIT 编辑
As the error come from a problem of conversion from URI
to State
, you could try to add a converter from URI to State (assuming your repository has a method findByName
to find a State
by its name
: 由于错误来自从
URI
到State
的转换问题,您可以尝试将URI转换为State(假设您的存储库有一个方法findByName
以按name
查找State
:
@Component
@StateConverter
public class URIToStateTypeConverter implements Converter<URI, State> {
@Autowired
StateRepository repository;
public State convert(URI uri) {
String source = uri.toString();
try {
long id = Long.valueOf(source);
return repository.findOne(id);
} catch (NumberFormatException e) { // should be a name ??
return repository.findByName(source);
}
}
}
And the conversion service initialization would become : 转换服务初始化将变为:
private @Autowired StringToStateTypeConverter stringToStateTypeConverter;
private @Autowired URIToStateTypeConverter uriToStateTypeConverter;
@Bean//(name="conversionService")
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new DefaultFormattingConversionService();
bean.addConverter(String.class, State.class, stringToStateTypeConverter);
bean.addConverter(URI.class, State.class, uriToStateTypeConverter);
return bean;
}
But I'm not sure if it will be used by spring-data-rest 但我不确定它是否会被spring-data-rest使用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.