복붙노트

[SPRING] Java 스프링 mvc : IllegalStateException : [java.lang.String] 유형의 값을 필수 유형으로 변환 할 수 없습니다.

SPRING

Java 스프링 mvc : IllegalStateException : [java.lang.String] 유형의 값을 필수 유형으로 변환 할 수 없습니다.

제목은 내 봄 웹 애플 리케이션에서 성가신 IllegalStateException을 가지고있다. 나는 행운없이 SO와 다른 포럼에서 수많은 주제를 다뤘다.

이 오류는 내 DB에 메모 (폴더 포함)를 유지하려고 할 때 발생합니다.

여기 내 컨트롤러가있다.

@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입니다.

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

여기 내 메모가 있습니다.

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

여기 내 폴더가 있습니다.

@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

}

오류;

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]

DB에 노트 (폴더 포함)를 유지하려고 할 때까지 모든 것이 잘 작동했습니다. 나는 여기서 선택권을 잃는다, 누군가는 문제를 보는가?

죄송합니다. 오류를 포함하지 않는 정보, 중요한 정보 :-) 내 NoteServiceImpl 클래스를 편집 했으므로 어디서 잘못되었는지 확인할 수 있습니다.

가능한 해결책은 '변환기 클래스'를 사용하여 문자열을 폴더로 변환하는 것입니다. 그래서 그것을 시도했지만, 나는 다소 갇혀있다. 나는 Converter 클래스를 그렇게 만들었다.

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>

그러나 나는 정확히 이것을 어디서 사용해야하는지 잘 모르겠다. 왜냐하면 내가 아는 한, 나는 Folder를 통과해야하는 String을 결코 전달하지 않기 때문이다. 나는

해결법

  1. ==============================

    1.컨트롤러에서 폴더 객체를 가져오고 folderName String 매개 변수를 전달하는 코드를 제거합니다. 노트 서비스 구현 클래스에서 folderService를 사용하여 작업을 수행하십시오.

    컨트롤러에서 폴더 객체를 가져오고 folderName String 매개 변수를 전달하는 코드를 제거합니다. 노트 서비스 구현 클래스에서 folderService를 사용하여 작업을 수행하십시오.

    트랜잭션 관리를 위해 데이터를 테이블에 병합 할 때 @Trasactional 주석을 사용하십시오.

    여기에 코드가있다.

    @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!";
    }
    
  2. ==============================

    2.처음부터 보면 데이터베이스 테이블에 해당 속성에 대한 잘못된 유형이있는 것으로 보입니다.

    처음부터 보면 데이터베이스 테이블에 해당 속성에 대한 잘못된 유형이있는 것으로 보입니다.

  3. from https://stackoverflow.com/questions/21089963/java-spring-mvc-illegalstateexception-cannot-convert-value-of-type-java-lang by cc-by-sa and MIT license