[SPRING] Spring MVC에서 Spring의 DomainClassConverter를 사용하는 경우의 문제점
SPRINGSpring MVC에서 Spring의 DomainClassConverter를 사용하는 경우의 문제점
내 Spring MVC 프로젝트에서 Spring의 DomainClassConverter 기능을 사용하려고한다. (나는 Spring MVC와 Spring에 대한 기본적인 지식 만 가지고있다.
API 문서에서 :
The DomainClassConverter allows you to use domain types in your Spring MVC controller
method signatures directly, so that you don't have to manually lookup the instances via
the repository: (PS: Example 1.20)
위의 내용에서 파인더 메서드를 작성할 필요가없고 Spring에서 User 개체를 제공한다는 점을 이해했습니다. 그래서 이것들이 제가 한 조치들입니다.
applicationcontext.xml에 아래 XML 행을 포함 시켰습니다.
<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.rl.userservice.controller.UserConverter"/>
</list>
</property>
Spring Data REST doc에 따라이 pom.xml에이 종속성을 포함시켰다.
내 컨트롤러는 다음과 같습니다.
저장소는 다음과 같습니다.
이것은 나의 변환기 서비스이다.
final class UserConverter implements Converter<Integer, NewUser> {
NewUserRepository newUserRepository;
public NewUser convert(Integer username) {
return newUserRepository.findOne(username);
}
}
프로그램을 실행하면 tomcat이 성공적으로 시작되지만 localhost : 8080 / userservice / api / newuser / 1 URL에 액세스 할 때 예외가 발생합니다.
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type
'com.mpp.userservice.domain.NewUser'; nested exception is
java.lang.IllegalStateException: Cannot convert value of type
[java.lang.String] to required type
[com.mpp.userservice.domain.NewUser]: no matching editors or
conversion strategy found
org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:71)
org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:45)
org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:595)
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:101)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause
java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type
[com.mpp.userservice.domain.NewUser]: no matching editors or
conversion strategy found
org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:264)
org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:93)
org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:61)
org.springframework.beans.TypeConverterSupport.convertIfNecessary(TypeConverterSupport.java:45)
org.springframework.validation.DataBinder.convertIfNecessary(DataBinder.java:595)
org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:101)
org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77)
org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:123)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.
mpp.
최고의 코드는 아니지만, 여기 내 컨트롤러가 있습니다.
public @ResponseBody ResponseEntity<ModelMap> getUserTypeJSON(@PathVariable("userID" String userID, HttpServletResponse response) {
UserType UserType = UserTypeRepository.findOne(id);
model.addAttribute("Name",UserType.getName());
...
}
여기에 내가 언급 한 예제가 있지만이 사용자 지정 변환기를 사용하고 있지만 도메인 변환기 서비스를 사용하지 않는 것 같습니다. 제발 조언. CRUD 작업을 작성하는 보편적 인 코드를 줄이려면이 방법을 사용할 수 있습니까? 다른 방법으로 데이터를 가져올 수 있다면이 DomainClassConverter의 진정한 이점은 무엇입니까?
Oliver Gierke 제안에 따라 업데이트 됨 - 여전히 작동하지 않으며 같은 오류
이 문서에서는 다음 내용을 설명합니다.
그래서 아래처럼 applicationcontext.xml을 업데이트했지만 같은 문제가 발생했습니다.
여전히 같은 문제입니다.
업데이트 : DomainClassConverter는 Java Config와 함께 작동하지만 XML 방식과는 작동하지 않습니다. 관심이 있고 유용한 정보를 얻을 수있는 다른 사람들을 위해 여기에 사용 된 코드가 있습니다.
pom.xml (정리가 필요할 수 있음)
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
<version>2.0.0.M1</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
컨트롤러 파일 (정리가 필요할 수 있음)
@RequestMapping("/domain/{id}")
public @ResponseBody ResponseEntity<ModelMap> showDomainUserForm(@PathVariable("id") User userMatch, HttpServletResponse response) {
// some code omitted…
ModelMap model = new ModelMap();
model.addAttribute("DOMAIN-MAP","Domain Controller Service");
model.addAttribute("Name",userMatch.getName());
model.addAttribute("Phone",userMatch.getPhone());
// some code omitted…
}
Java 구성 파일은 resource1 및 resource2의 예제를 사용하여 어셈블됩니다. (정리가 필요할 수도 있음)
package com.rl.userservice.controller;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.repository.support.DomainClassConverter;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Configuration
@ComponentScan
@EnableWebMvc
public class WebConfig extends WebMvcConfigurationSupport{
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);
handlerMapping.setUseTrailingSlashMatch(false);
return handlerMapping;
}
@Bean
public DomainClassConverter<?> domainClassConverter() {
return new DomainClassConverter<FormattingConversionService>(mvcConversionService());
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
applicationContext.xml에 아래 빈 정의를 추가합니다.
<bean class="com.rl.userservice.controller.WebConfig"/>
해결법
-
==============================
1.URL은 String이므로 {id}도 String입니다. 따라서 서비스가 Integer가 아닌 String을 NewUser로 변환 할 수 있어야합니다.
URL은 String이므로 {id}도 String입니다. 따라서 서비스가 Integer가 아닌 String을 NewUser로 변환 할 수 있어야합니다.
-
==============================
2.참조 설명서의 관련 섹션에서 DomainClassConverter를 구성하는 올바른 방법을 확인하십시오.
참조 설명서의 관련 섹션에서 DomainClassConverter를 구성하는 올바른 방법을 확인하십시오.
-
==============================
3.심판은 말한다
심판은 말한다
그 이유가되어서는 안됩니까?
-
==============================
4.이 구성은 사용자 정의 변환 서비스를 설정하고 컨트롤러를 감지하고 설정하는 주석 검색 메커니즘에 전달합니다.
이 구성은 사용자 정의 변환 서비스를 설정하고 컨트롤러를 감지하고 설정하는 주석 검색 메커니즘에 전달합니다.
<bean name="conversionService" class="rest.gateway.services.MyConversionService"/> <mvc:annotation-driven conversion-service="conversionService" />
그리고 이것은 사용자 정의 컨트롤러의 코드입니다. 고객은 User와 같은 도메인 클래스입니다.
public class MyConversionService extends DefaultConversionService { public MyConversionService() { super(); addConverter(String.class, Customer.class, new Converter<String, Customer>() { @Override public Customer convert(String source) { return new Customer("123456","Doe","John"); } }); } }
이 버전 2.0.0.M1 작동하기 때문에이 시도하십시오 :
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-rest-webmvc</artifactId> <version>2.0.0.M1</version> </dependency> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>http://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
from https://stackoverflow.com/questions/20695180/issues-using-springs-domainclassconverter-in-spring-mvc by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC에서 컨트롤러 로케일 찾기 (0) | 2019.04.07 |
---|---|
[SPRING] Bcrypt로 InMemoryAuthentication 비밀번호 암호화 (0) | 2019.04.07 |
[SPRING] 커스텀 어노테이션의 스프링 표현 언어 (0) | 2019.04.07 |
[SPRING] Spring 데이터 PageImpl이 올바른 크기의 페이지를 반환하지 않습니까? (0) | 2019.04.07 |
[SPRING] Spring 클래스 EnvironmentCapable (0) | 2019.04.07 |