Kann nicht Feld com.Sonne.proxy.$Proxy
Für Datei-upload, den ich versuche zu injizieren und verwenden Sie eine Prüfung in meinen Spring Controller wie diesem:
@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);
}
}
}
Hier ist mein 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");
}
}
}
Hier ist das File-Objekt, das ich versuche zu überprüfen:
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;
}
}
Und hier ist die Fehlermeldung, die ich bekomme, wenn ich versuche zu starten meiner Anwendung:
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)
Ich weiß nicht, was passiert. Kann mir jemand helfen?
- 1. Verwenden Sie niemals
@Autowired
auf den Feldern. 2. Es ist eine Konfiguration für web-Sicherheit, so dass es nicht viel Sinn zu setzen@PreAuthorize("hasAuthority('ADMINISTRATOR')")
auf eine controller-Methode. Die Kombination dieser beiden Punkte ist die Ursache des Problems. - diese sind ziemlich breiten Aussagen. Beide Dinge, die Sie Objekt, um Ihren Platz haben.
- Der Frühling Entwickler selbst raten von der Verwendung von
@Autowired
auf den Feldern. Aber wenn Sie haben einen Platz für Sie, dann sind Sie frei, es zu benutzen, natürlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
FileValidator
ist eine Klasse, keine Schnittstelle.com.sun.proxy.$Proxy101
ist eine Schnittstelle proxy, kein proxy-Klasse.Gibt es zwei Möglichkeiten, um dieses Problem zu lösen. Entweder Spritzen Sie den validator über eine Schnittstelle, e.g:
aktivieren oder Klasse-proxies, e.g:
Diese sind nur Beispiele, es gibt andere Wege, um diese zwei Lösungen.
FileValidator
aberFileController
.FileController
und dann können dievalidator
. Die Fehlermeldung kann nicht mehr explizit.$Proxy101
bezieht sich auf die Vollmacht von einemFileValidator
bean, die nicht zugeordnet werden können, um eineFileValidator
typisierte Feld, weil es implementiertValidator
statt AusweitungFileValidator
.FileValidator
?FileController.validator
?Autowire die Schnittstelle
FileValidator(class)
in Ihrer KlasseFileController
.Dadurch wird nicht verlangen, dass Sie angeben, @Qualifier wie unten erwähnt: