弹簧数据rest场转换器

我很难在spring数据REST项目(控制器免费应用程序和严格的java配置)上使用我的自定义转换器

我有两个实体,一个员工和一个州。 这种关系是@ManyToOne,我相信大家都知道。 无论如何,问题是将state字段(字段名称为state)从String转换为State对象,并将setState()类中的setState()转换为数据库的持久性。

 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 + "]"; } } 

我已经使用转换服务注册了我的转换器,但仍然无法在表单提交时将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 getConverters() { Set converters = new HashSet(); converters.add(new StringToStateTypeConverter()); return converters; } 

这是我的StateConverter

 @Component @StateConverter public class StringToStateTypeConverter implements Converter { @Autowired StateRepository repository; public State convert(String source) { return repository.findOne(new Long(source)); } } 

提交时,我收到此错误:

引起:org.springframework.core.convert.ConversionFailedException:无法从类型java.net.URI转换为类型为’AB’的com.hr.domain.State;

任何forms的帮助将不胜感激。

愿力量与你同在。

这是错误跟踪

 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 

您注册了一个新的ConversionService 。 它取代了弹簧在默认情况下注册的默认值,通常假定存在许多转换器。 并且您创建了一个新的转换器,而不是使用您配置的bean。 你应该改为:

  • 使用所有默认转换器注册spring的默认转换服务
  • 添加转换器到这个

您的转换服务初始化可能如下所示:

 private @Autowired StringToStateTypeConverter stringToStateTypeConverter; @Bean//(name="conversionService") public ConversionService getConversionService() { ConversionServiceFactoryBean bean = new DefaultFormattingConversionService(); bean.addConverter(String.class, State.class, stringToStateTypeConverter); return bean; } 

编辑

由于错误来自从URIState的转换问题,您可以尝试将转换器从URI添加到State(假设您的存储库有一个方法findByName以按name查找State

 @Component @StateConverter public class URIToStateTypeConverter implements Converter { @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); } } } 

转换服务初始化将变为:

 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; } 

但我不确定它是否会被spring-data-rest使用