Im пытается сделать FileUpload (через RestController, а также попытался с контроллером), но он всегда возвращает 404.Невозможно сделать загрузку файлов на RestController за SpringSecurity (получил 404)
Существует обратный прокси перед этого приложения, поэтому точкой входа является/v2/service.
Все остальные вызовы API работают нормально, за исключением загрузки этого файла. Пожалуйста, порекомендуйте.
Моя конфигурация
@Configuration
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "multipart", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
@Autowired
private MultipartProperties multipartProperties = new MultipartProperties();
@Bean(name="multipartResolver")
public CommonsMultipartResolver getResolver() throws IOException{
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setMaxUploadSizePerFile(1242880);
return resolver;
}
@Bean
@ConditionalOnMissingBean
public MultipartConfigElement multipartConfigElement() {
return this.multipartProperties.createMultipartConfig();
}
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
}
И мой контроллер: (я попробовал RestController и контроллер, и дал мне 404)
@RestController
public class UploadController {
@Autowired
private ImageService imageService;
@RolesAllowed({ "ROLE_USER" })
@RequestMapping(value="/api/item/image/u", method=RequestMethod.POST)
public String handleFileUpload(@RequestPart("file") MultipartFile file) throws ImageSizeException, IOException{
System.out.println("Upload start : ");
returns "YEY";
}
}
фрагмент моей конфигурации пружины безопасности:
@Configuration
public class OAuth2ServerConfiguration {
private static final String RESOURCE_ID = "batmanservice";
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends
ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
// @formatter:off
resources.resourceId(RESOURCE_ID);
// @formatter:on
}
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/api").hasRole("USER")
.antMatchers("/batsearch").anonymous();
http.csrf().disable();
// @formatter:on
}
}
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends
AuthorizationServerConfigurerAdapter {
private TokenStore tokenStore = new InMemoryTokenStore();
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
private UserService userService;
@Autowired
private CustomUserDetailsService userDetailsService;
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer
.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
// @formatter:off
endpoints
.tokenStore(this.tokenStore)
.authenticationManager(this.authenticationManager)
.userDetailsService(this.userDetailsService);
// @formatter:on
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
// @formatter:off
clients
.inMemory()
.withClient("batclient")
.authorizedGrantTypes("password", "authorization_code", "refresh_token")
.authorities("ROLE_USER")
.scopes("read", "write", "trust")
.accessTokenValiditySeconds(18000)
.resourceIds(RESOURCE_ID)
.secret("batmansecret");
// @formatter:on
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setSupportRefreshToken(true);
tokenServices.setTokenStore(this.tokenStore);
return tokenServices;
}
}
}
И вот как я тестировал, используя почтальон: который:
POST /v2/service/api/item/image/u?access_token=9105dbcd-00a4-4614-aa69-a53e83bc356e HTTP/1.1
Host: localhost:8080
Authorization: Basic YzNidTRwcDBuZTpGRjAxNURFQUQwNjVBMEEw
Cache-Control: no-cache
Postman-Token: 2ad8977e-842e-c442-e480-9004b9d21854
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename=""
Content-Type:
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name=""
------WebKitFormBoundary7MA4YWxkTrZu0gW--
спасибо @ Химаншу. на самом деле я забыл упомянуть, что есть обратный прокси (следовательно/v2/service), который находится перед этим приложением. – xtrycatchx