[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.그 오류 메시지는 기본적으로 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.나는이 질문이 오래되었다는 것을 압니다.하지만 대답을 찾지 못하면 누군가를 도울 수 있습니다. 쉽게 찾을 수 없습니다.
나는이 질문이 오래되었다는 것을 압니다.하지만 대답을 찾지 못하면 누군가를 도울 수 있습니다. 쉽게 찾을 수 없습니다.
이 문제를 해결하기 위해 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"로 설정해야합니다.
from https://stackoverflow.com/questions/25234357/select-tag-with-object-thymeleaf-and-spring-mvc by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] spring-mvc에서 페이지를 리디렉션하는 매개 변수를 전달하는 방법 (0) | 2019.03.30 |
---|---|
[SPRING] Thymeleaf 템플릿에서 세션 속성에 액세스하기 (0) | 2019.03.30 |
[SPRING] Spring에서 CORS 지원을 완전히 비활성화 할 수 있습니까? (0) | 2019.03.30 |
[SPRING] 적합한 기본 RequestUpgradeStrategy가 없습니다. (0) | 2019.03.30 |
[SPRING] 나머지와 함께 부울 값을 반환하는 방법? (0) | 2019.03.30 |