Java 无法将字段设置为 com.sun.proxy.$Proxy

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37726351/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 19:36:51  来源:igfitidea点击:

Can not set field to com.sun.proxy.$Proxy

javaspringspring-mvcspring-bootspring-aop

提问by FunnyJava

For file upload I am trying to inject and use a Validator in my Spring Controller like this:

对于文件上传,我试图在我的 Spring Controller 中注入和使用验证器,如下所示:

@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);
        }
    }

}

Here is my Validator:

这是我的验证器:

@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");
        } 
    }
}

Here is the File object that I am trying to validate:

这是我要验证的 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;
    }

}

And here is the error that I get when I try to start my application:

这是我尝试启动应用程序时遇到的错误:

    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.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)

I don't know what's happening. Can anyone help?

我不知道发生了什么。任何人都可以帮忙吗?

采纳答案by OrangeDog

Can not set 'FileValidator' field 'FileController.validator' to 'com.sun.proxy.$Proxy101'

无法将“FileValidator”字段“FileController.validator”设置为“com.sun.proxy.$Proxy101”

FileValidatoris a class, not an interface.

FileValidator是一个类,而不是一个接口。

com.sun.proxy.$Proxy101is an interface proxy, not a class proxy.

com.sun.proxy.$Proxy101是接口代理,不是类代理。

There are two main ways to solve this. Either inject the validator via an interface, e.g:

有两种主要方法可以解决这个问题。通过接口注入验证器,例如:

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

or enable class-proxies, e.g:

或启用类代理,例如:

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

Those are just examples, there will be other ways to implement those two solutions.

这些只是示例,还有其他方法可以实现这两种解决方案。

回答by pgcool

Autowire the interface of FileValidator(class)in your class FileController. Doing this will not require you to specify @Qualifier as mentioned below:

自动装配的接口FileValidator(class)在类FileController。这样做不需要您指定@Qualifier,如下所述:

@Autowired
IFileValidator filevalidator;