Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧数据静止场转换器_Java_Spring_Rest_Spring Mvc - Fatal编程技术网

Java 弹簧数据静止场转换器

Java 弹簧数据静止场转换器,java,spring,rest,spring-mvc,Java,Spring,Rest,Spring Mvc,我很难在spring data REST项目(无控制器应用程序和严格的java配置)上使用自定义转换器。 我有两个实体,一个雇员和一个州。我们的关系是多方面的,我相信我们都知道这一点。无论如何,问题在于将状态字段(字段名为state)从字符串转换为状态对象,并将员工类中的设置状态()持久化为数据库 package com.hr.domain; @Entity public class Employee implements Serializable { private static f

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

我有两个实体,一个雇员和一个州。我们的关系是多方面的,我相信我们都知道这一点。无论如何,问题在于将
状态
字段(字段名为state)从
字符串
转换为
状态
对象,并将
员工
类中的
设置状态()
持久化为数据库

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

您需要注册一个新的
转换服务
。它用许多通常假定存在的转换器替换了spring默认注册的默认转换器。您可以创建一个新的转换器,而不是使用您配置的bean。你应该:

  • 使用spring的所有默认转换器注册spring的默认转换服务
  • 将您的转换器添加到此转换器
您的转换服务初始化可能如下所示:

private @Autowired StringToStateTypeConverter stringToStateTypeConverter;

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

由于错误源于从
URI
State
的转换问题,您可以尝试添加一个从URI到State的转换器(假设您的存储库有一个方法
findByName
,通过它的
名称
查找
状态

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

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

谢谢Serge。我按照您的建议对自定义转换器的注册进行了更改。是否有方法在每个表单帖子上调用转换器(使用注释等)因为我仍然会遇到问题中描述的错误。请注意:我正在尽量避免使用控制器。您应该发布完整的堆栈跟踪。导致错误的查询是什么?什么是
AB
?AB值是HTTP post请求中的字段值。这是需要转换为的字符串一个状态对象。为了更具体,我添加了关于这个问题的更多信息。AIK spring data rest在输入和输出时使用JSON。您是否尝试其他方式?没有。我的表单POST请求使用JSON,因为我在UI中使用ExtJS。这可以与所有其他POST请求(JSON)一起使用。如果我公开实体ID(我真的不想这么做,因为它也是一个API),它工作得很好。我选择的替代方法是在提交时使用状态名。请求负载中的状态名是在将Employee持久化到数据库之前应该转换为状态对象的
private @Autowired StringToStateTypeConverter stringToStateTypeConverter;

@Bean//(name="conversionService")
public ConversionService getConversionService() {       
    ConversionServiceFactoryBean bean = new DefaultFormattingConversionService();
    bean.addConverter(String.class, State.class, stringToStateTypeConverter);
    return bean;
}
@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);
        }
    }
}
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;
}