Ne pouvez pas définir le champ de com.soleil.proxy.$Proxy
Pour le fichier de téléchargement, je suis en train d'injecter et d'utiliser un programme de validation dans mon Printemps Contrôleur comme ceci:
@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);
}
}
}
Voici mon programme de validation:
@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");
}
}
}
Voici le Fichier de l'objet que je suis en train de valider:
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;
}
}
Et voici l'erreur que j'obtiens quand j'essaie de lancer mon 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$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)
Je ne sais pas ce qui se passe. Quelqu'un peut-il aider?
1. N'utilisez jamais de
ceux qui sont assez larges consolidés. Ces deux choses, vous vous opposez à leur place.
Le Printemps développeurs eux-mêmes de décourager l'utilisation de
@Autowired
sur les champs. 2. Il existe une configuration de la sécurité sur le web de sorte qu'il n'a pas beaucoup de sens de mettre @PreAuthorize("hasAuthority('ADMINISTRATOR')")
sur une méthode de contrôleur. La combinaison de ces deux points est la cause de votre problème.ceux qui sont assez larges consolidés. Ces deux choses, vous vous opposez à leur place.
Le Printemps développeurs eux-mêmes de décourager l'utilisation de
@Autowired
sur les champs. Mais si vous avez une place pour elle, alors vous êtes libre de l'utiliser, bien sûr.
OriginalL'auteur FunnyJava | 2016-06-09
Vous devez vous connecter pour publier un commentaire.
FileValidator
est une classe, pas une interface.com.sun.proxy.$Proxy101
est un proxy de l'interface, pas une classe proxy.Il existe principalement deux façons de résoudre ce problème. Soit injecter le programme de validation via une interface électronique.g:
ou de permettre à la classe des procurations, e.g:
Ce sont juste des exemples, il y en aura d'autres façons de mettre en œuvre ces deux solutions.
Le problème n'est pas
FileValidator
maisFileController
.le problème est de savoir comment ils interagissent - ce n'est pas seulement l'un ou l'autre.
Pas de. Printemps essaie de créer un proxy pour
FileController
et puis impossible de définir lavalidator
. Le message d'erreur ne peut pas être plus explicite.Le
$Proxy101
se réfère à la procuration d'unFileValidator
bean, qui ne peut pas être attribué à unFileValidator
de type de champ parce qu'il met en œuvreValidator
au lieu de l'étendreFileValidator
.OriginalL'auteur OrangeDog
Autowire l'interface de
FileValidator(class)
dans votre classeFileController
.Faire ce ne sera pas vous obliger à préciser @Qualifier comme mentionné ci-dessous:
OriginalL'auteur pgcool