복붙노트

[SPRING] Spring MVC에서 Spring의 DomainClassConverter를 사용하는 경우의 문제점

SPRING

Spring 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. ==============================

    1.URL은 String이므로 {id}도 String입니다. 따라서 서비스가 Integer가 아닌 String을 NewUser로 변환 할 수 있어야합니다.

    URL은 String이므로 {id}도 String입니다. 따라서 서비스가 Integer가 아닌 String을 NewUser로 변환 할 수 있어야합니다.

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

    2.참조 설명서의 관련 섹션에서 DomainClassConverter를 구성하는 올바른 방법을 확인하십시오.

    참조 설명서의 관련 섹션에서 DomainClassConverter를 구성하는 올바른 방법을 확인하십시오.

  3. ==============================

    3.심판은 말한다

    심판은 말한다

    그 이유가되어서는 안됩니까?

  4. ==============================

    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>
    
  5. from https://stackoverflow.com/questions/20695180/issues-using-springs-domainclassconverter-in-spring-mvc by cc-by-sa and MIT license