1

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

И вот как я тестировал, используя почтальон: enter image description here который:

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

ответ

0

В вашей реализации UploadController, @RequestMapping находится на пути "/ апи/элемент/изображение/у", но апи называется на «/ службы/API/элемент/изображение/у ». Я не вижу «сервис /» в любом месте в качестве префикса или в вашем контроллере, следовательно, 404.

+0

спасибо @ Химаншу. на самом деле я забыл упомянуть, что есть обратный прокси (следовательно/v2/service), который находится перед этим приложением. – xtrycatchx