복붙노트

[SPRING] 필드를 com.sun.proxy. $ Proxy로 설정할 수 없습니다

SPRING

필드를 com.sun.proxy. $ Proxy로 설정할 수 없습니다

파일 업로드를 위해 다음과 같이 Spring Controller에 Validator를 주입하고 사용하려고합니다.

@RestController
@RequestMapping("/api")
public class FileController{

    @Autowired
    private MessageSource messageSource;

    @Autowired
    FileValidator validator;

    @InitBinder("file")
    public void initBinderFile(WebDataBinder binder) {
        binder.setValidator(validator);
    }

    @RequestMapping(value = "/fileUpload2", method = RequestMethod.POST, produces = {"text/plain"})
    @PreAuthorize("hasAuthority('ADMINISTRATOR')")
    public String singleFileUpload2(@Valid @ModelAttribute("file") File file, BindingResult result) throws IOException {
        if (result.hasErrors()) {
            String errorString = "";
            for (ObjectError error : result.getAllErrors()) {
                 errorString = errorString.concat(messageSource.getMessage(error.getCode(), new String[]{}, Locale.ENGLISH)+"\n");
            }
            return errorString;
        } else {
            MultipartFile multipartFile = file.getFile();

            String fileName = multipartFile.getOriginalFilename();
            System.out.println("Fetching file: "+fileName);

            return messageSource.getMessage("upload.file.success", new String[]{}, Locale.ENGLISH);
        }
    }

}

여기 내 유효성 검사기가 있습니다.

@Component
public class FileValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return File.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        File file = (File) obj;

        if (file.getFile().getSize() == 0) {
            errors.rejectValue("file", "missing.file");
        } else try {
            if (file.getFile().getBytes().length > 2097152l) {
                errors.rejectValue("file", "upload.file.error.size");
            }
            if(!file.getFile().getContentType().equalsIgnoreCase("text/html")){
                 errors.rejectValue("file", "incorrect.file.type");
            }
        } catch (IOException ex) {
            errors.rejectValue("file", "upload.file.error");
        } 
    }
}

유효성을 검사하려는 File 객체는 다음과 같습니다.

public class File {

    private String name;
    private MultipartFile file;

    public File() {
    }

    public File(MultipartFile file) {
        this.file = file;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public MultipartFile getFile() {
        return file;
    }

    public void setFile(MultipartFile file) {
        this.file = file;
    }

}

응용 프로그램을 시작하려고 할 때 발생하는 오류는 다음과 같습니다.

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fileController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.enterprise.springapp.web.validators.FileValidator com.eurodyn.springapp.web.FileController.validator; nested exception is java.lang.IllegalArgumentException: Can not set com.enterprise.springapp.web.validators.FileValidator field com.enterprise.springapp.web.FileController.validator to com.sun.proxy.$Proxy101
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at com.enterprise.springapp.SpringApp.main(SpringApp.java:30) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.enterprise.springapp.web.validators.FileValidator com.enterprise.springapp.web.FileController.validator; nested exception is java.lang.IllegalArgumentException: Can not set com.enterprise.springapp.web.validators.FileValidator field com.enterprise.springapp.web.FileController.validator to com.sun.proxy.$Proxy101
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    ... 17 common frames omitted
Caused by: java.lang.IllegalArgumentException: Can not set com.enterprise.springapp.web.validators.FileValidator field com.enterprise.springapp.web.FileController.validator to com.sun.proxy.$Proxy101
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:1.8.0_45]
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:1.8.0_45]
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) ~[na:1.8.0_45]
    at java.lang.reflect.Field.set(Field.java:764) ~[na:1.8.0_45]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    ... 19 common frames omitted
2016-06-09 15:12:39.909  WARN 4896 --- [           main] o.s.boot.SpringApplication               : Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration': Initialization of bean failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry' is defined)

무슨 일이 일어나고 있는지 모르겠습니다. 누구든지 도울 수 있습니까?

해결법

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

    1.FileValidator는 인터페이스가 아닌 클래스입니다.

    FileValidator는 인터페이스가 아닌 클래스입니다.

    com.sun.proxy. $ Proxy101은 클래스 프록시가 아닌 인터페이스 프록시입니다.

    이 문제를 해결하는 두 가지 주요 방법이 있습니다. 다음과 같은 인터페이스를 통해 유효성 검사기를 주입하십시오.

    @Autowired @Qualifier("fileValidator")
    private Validator fileValidator;
    

    또는 클래스 프록시를 활성화합니다 (예 :

    @SpringBootApplication
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    public class Application {
    

    이것들은 단지 예일 뿐이며,이 두 가지 솔루션을 구현하는 다른 방법이있을 것입니다.

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

    2.클래스 FileController에서 FileValidator (class)의 인터페이스를 자동으로 연결하십시오. 이렇게하면 아래와 같이 @Qualifier를 지정할 필요가 없습니다.

    클래스 FileController에서 FileValidator (class)의 인터페이스를 자동으로 연결하십시오. 이렇게하면 아래와 같이 @Qualifier를 지정할 필요가 없습니다.

    @Autowired
    IFileValidator filevalidator;
    
  3. from https://stackoverflow.com/questions/37726351/can-not-set-field-to-com-sun-proxy-proxy by cc-by-sa and MIT license