복붙노트

[SPRING] 객체로 태그 선택 - Thymeleaf 및 Spring MVC

SPRING

객체로 태그 선택 - Thymeleaf 및 Spring MVC

이 예제에서는 thymeleafexamples-stsm 코드를 변경하려고하므로 클래스 유형에 대한 열거 형을 변경했습니다.

Type.java

public class Type { 

    private Integer id; 
    private String type; 
   ...getters and setters 
}

SeedStarterMngController.java

@ModelAttribute("allTypes") 
    public List<Type> populateTypes() { 
        Type type1 = new Type(); 
        type1.setId(1); 
        type1.setType("OUTDOOR"); 

        Type type2 = new Type(); 
        type2.setId(2); 
        type2.setType("INDOOR"); 

        List<Type> tipos = new ArrayList<Type>(); 
        tipos.add(type1); 
        tipos.add(type2); 
        return tipos; 
    } 

seedstartermng.html

<select th:field="*{type}">
    <option th:each="type : ${allTypes}" th:value="${type}" th:text="${type.type}">Wireframe</option>
</select>

그래서 나는 씨앗 초보를 추가 할 수 없다.

내 출력 html

<select id="type" name="type">
    <option value="thymeleafexamples.stsm.business.entities.Type@2c08cec0">OUTDOOR</option>
    <option value="thymeleafexamples.stsm.business.entities.Type@26cf024">INDOOR</option>
</select>

오류는

올바르게 입력 할 수있는 방법은 무엇입니까? 네가 나를 도울 수 있기를 바랍니다. 고맙습니다.

해결법

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

    1.그 오류 메시지는 기본적으로 Spring이 문자열 thymeleafexamples.stsm.business.entities.Type@2c08cec0을 Type의 인스턴스로 변환하는 방법을 알지 못한다고 말합니다. 이렇게하면 코드에서 버그가 발생하므로 이해가되지 않습니다.

    그 오류 메시지는 기본적으로 Spring이 문자열 thymeleafexamples.stsm.business.entities.Type@2c08cec0을 Type의 인스턴스로 변환하는 방법을 알지 못한다고 말합니다. 이렇게하면 코드에서 버그가 발생하므로 이해가되지 않습니다.

    Object의 toString () 값을 양식 드롭 다운 식별자로 사용하지 않아도됩니다. 사용자가 선택한 유형을 코드에서 식별 할 수있는 더 나은 전략이 필요합니다.

    일반적인 접근법은 id 속성을 사용하는 것이다.

    <option th:each="type : ${allTypes}" th:value="${type.id}" th:text="${type.type}">Wireframe</option>
    

    양식이 제출되면 컨트롤러의 ID 이름을 기반으로 Type의 인스턴스를 검색해야합니다.

  2. ==============================

    2.나는이 질문이 오래되었다는 것을 압니다.하지만 대답을 찾지 못하면 누군가를 도울 수 있습니다. 쉽게 찾을 수 없습니다.

    나는이 질문이 오래되었다는 것을 압니다.하지만 대답을 찾지 못하면 누군가를 도울 수 있습니다. 쉽게 찾을 수 없습니다.

    이 문제를 해결하기 위해 Thymeleaf는 Formatters를 사용하여 Object와 String 사이를 변환합니다.

    먼저 태그에 사용할 클래스의 Formatter 서비스를 구현합니다.

    @Service
    public class TypeFormatter implements Formatter<Type> {
    
        @Autowired
        TypeService typeService;//Service -> DB
    
        @Override
        public String print(Type object, Locale locale) {
            return (object != null ? object.getId().toString() : "");
        }
    
        @Override
        public Type parse(String text, Locale locale) throws ParseException {
            Integer id = Integer.valueOf(text);
            return this.typeService.get(id);//return Type object form DB
        }
    }
    

    두 가지 방법으로 매우 간단한 클래스입니다.

    이제 우리는 Spring-Thymeleaf에게 우리의 포매터에 대해 말했거나 우리는 그것을 포매터라고 부를 것입니다. 이를 위해 우리는 WebConfig (WebMvcConfigurerAdapter를 확장 한 Configuration 클래스)에이 포매터를 등록해야합니다.

    @Configuration
    @EnableWebMvc
    @ComponentScan(value = { "your package" })
    public class WebConfig extends WebMvcConfigurerAdapter {
    
    ....
        //Formatters
    
        @Autowired //Without autowire, this solution may not work
        private TypeFormatter typeFormatter;
    
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addFormatter(typeFormatter);
        }
    }
    

    이제 우리의 솔루션은 html 파일로 구현 될 준비가되었지만 Thymeleaf에게 변환을 적용하는 방법을 알려주십시오. 답은 th : field = "* {type}"속성을 사용하고 이중 대괄호 구문을 사용하는 것입니다. th : value = "$ {{type}}":

    <select th:field="*{type}">
        <option th:value="NULL" th:text="---Select Type---"></option>
        <option th:each="type : ${allTypes}" th:value="${{type}}" th:text="${type.type}">Wireframe</option>
    </select>
    

    마지막으로, 사용자에게 설명 할뿐만 아니라 기본 선택을 방지하기 위해 "----- Select Type -----"과 같은 드롭 다운 목록에 헤더를 추가하기를 원할 때가 있습니다. 이 경우 변환 오류가 발생하지 않는 한 th : value = "NULL"로 설정해야합니다.

  3. from https://stackoverflow.com/questions/25234357/select-tag-with-object-thymeleaf-and-spring-mvc by cc-by-sa and MIT license