Java spring mvc:IllegalStateException:无法将[java.lang.String]类型的值转换为所需的类型 [英] Java spring mvc: IllegalStateException: Cannot convert value of type [java.lang.String] to required type

查看:1270
本文介绍了Java spring mvc:IllegalStateException:无法将[java.lang.String]类型的值转换为所需的类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如标题所示,我在我的spring web应用程序中遇到了恼人的IllegalStateException。
我在SO和其他论坛上已经经历过无数的话题,没有任何运气。

As the title says i'm having an annoying IllegalStateException in my spring web app. I've been through numerous topics here on SO and other forums, without any luck.

当我试图持续一个Note包含一个文件夹)在我的数据库中。

The error occurs when i'm trying to persist a Note (containing a Folder) in my DB.

这是我的控制器;

Here's my controller;

@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(Folder.class, new FolderEditor());
}

@RequestMapping(value="/notes")
public @ResponseBody List<Note> postNote(@RequestParam("folder") String folderName,                          
@ModelAttribute(value="note")Note note,  BindingResult result){

    folderName = folderName.replaceAll("\\s+","");
    Folder folder = folderService.getFolderByName(folderName);

    noteService.insertNote(note, folder);

    if(result.hasErrors()){
        System.out.println(result.getFieldError());
}

return noteService.getNotes();

}

这是我的NoteServiceImpl;

Here's my NoteServiceImpl;

public String insertNote(Note note, Folder folder) {

    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    note.setFolder(folder);
    em.merge(note); //i've used merge *and* persist
            // this is where it goes wrong!

    tx.commit();
    em.close();

    return "Succes!";
}

这是我的笔记;

Here's my Note;

@Entity
@Table(name="note")
public class Note implements Serializable {

@Id @GeneratedValue
private long id;

private String header;
private String text;

@ManyToOne
private Folder folder;

    // + getters and setters
}

这是我的文件夹;

Here's my Folder;

@Entity
public class Folder implements Serializable {
@Id @GeneratedValue
private long id;

private String name;

@OneToMany
private List<Note> notes;

@ManyToOne
private User user;

//+ getters and setters

}

错误;

Error;

Field error in object 'note' on field 'folder': 
rejected value [ public]; codes [typeMismatch.note.folder,typeMismatch.folder,typeMismatch.com.minimalito.model.Folder,typeMismatch]; 
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: 
codes [note.folder,folder]; arguments []; default message [folder]]; 
default message [Failed to convert property value of type 'java.lang.String' to required type 'com.minimalito.model.Folder' for property 'folder'; 
nested exception is java.lang.IllegalStateException: 
Cannot convert value of type [java.lang.String] to required type [com.minimalito.model.Folder] for property 'folder': no matching editors or conversion strategy found]

一切工作正常,直到我试图坚持一个笔记(与文件夹)在我的数据库。
我在这里没有选择,有没有人看到这个问题?

Everything was working fine until I tried to persist a Note (with a Folder) in my DB. I am out of options here, does anyone see the problem?

抱歉,不包括错误,关键信息:-)
我编辑了我的NoteServiceImpl类,现在你可以看到它出错了。

Sorry guys for not including the error, crucial bit of information :-) I've edited my NoteServiceImpl class, now you can see where it goes wrong.

我找到的一些可能的解决方案包括使用'converter class'将字符串转换为文件夹。所以我尝试过,但我有点卡住了,我创建了一个类似这样的Converter类;

A few possible solutions I have found consist of using a 'converter class', to convert the String to a Folder. So I have tried that, but i'm kinda stuck, I have created a Converter-class like so;

public final class StringToFolder implements Converter<String, Folder> {

@Autowired
FolderServiceImpl folderServiceImpl;

public Folder convert(String source){
    Folder f = folderServiceImpl.getFolderByName(source);

    return f;
}
}

和配置文件;

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean id="StringToFolderConverter" class="com.minimalito.converter.StringToFolder" />
        </list>
    </property>
</bean>

但我真的不知道我该在哪里使用这个...因为就我而言知道,我从来没有传递一个字符串,我应该通过一个文件夹。

But I don't really know where exactly I should use this...because as far as I know, I am never passing a String where I should be passing a Folder. I

推荐答案

移除代码以获取控制器中的文件夹并传递 folderName 字符串参数。在Note Service实现类中,使用folderService来完成这项工作。

Remove the code to get the folder object in your controller and pass the folderName String parameter. In your Note Service implementation class use the folderService to do the job.

在将数据合并到管理事务的表中时,使用 @Trasactional 注释

Use the @Trasactional annotation when you merge your data to the table for managing transaction,

以下是代码

Here's the code

@Transactional
public String insertNote(Note note, String folderName) {
  try{
    EntityManager em = emf.createEntityManager();
    Folder folder = folderService.getFolderByName(folderName);
    note.setFolder(folder);
    em.flush();
    em.merge(note);
  }catch(Exception e){
      e.printStackTrace();
  }
return "Success!";
}

这篇关于Java spring mvc:IllegalStateException:无法将[java.lang.String]类型的值转换为所需的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆