복붙노트

[SPRING] 다중 부품 구성이 제공되지 않아 부품을 처리 할 수 ​​없음

SPRING

다중 부품 구성이 제공되지 않아 부품을 처리 할 수 ​​없음

나는 파일 업로드를위한 간단한 컨트롤러를 썼다.

@RestEndpoint
public class ImageController {
    @Autowired
    GridFsTemplate mTemplate;

    @RequestMapping(value = "images", method = RequestMethod.POST)
    public @ResponseBody String testPhoto(@RequestParam String name, @RequestParam String directory, @RequestParam MultipartFile file) throws IOException {

        if(!file.isEmpty()){
            final byte[] bytes = file.getBytes();
            InputStream inputStream = new ByteArrayInputStream(bytes);
            mTemplate.store(inputStream, "name");

            return "uploaded photo";
        }

        return "failed";
    }

} 

@RestEndpoint 주석은 다음과 같습니다.

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
public @interface RestEndpoint
{
    String value() default "";
}

내 ContextConfiguration 클래스는 다음과 같습니다.

@Configuration
@EnableWebMvc
@ComponentScan(
    basePackages = "com.questter.site",
    useDefaultFilters = false,
    includeFilters =
    @ComponentScan.Filter({RestEndpoint.class, RestEndpointAdvice.class})
)
public class RestServletContextConfiguration extends WebMvcConfigurerAdapter {
    @Bean
    public CommonsMultipartResolver multiPartResolver(){

        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        return resolver;
    }
...
}

--- 업데이트 ---

web.xml 파일 :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">

    <display-name>Spring Application</display-name>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <url-pattern>*.jspf</url-pattern>
            <page-encoding>UTF-8</page-encoding>
            <scripting-invalid>true</scripting-invalid>
            <include-prelude>/WEB-INF/jsp/base.jspf</include-prelude>
            <trim-directive-whitespaces>true</trim-directive-whitespaces>
            <default-content-type>text/html</default-content-type>
        </jsp-property-group>
    </jsp-config>

    <!--<context-param>-->
        <!--<param-name>spring.profiles.active</param-name>-->
        <!--<param-value>development</param-value>-->
    <!--</context-param>-->

    <session-config>
        <session-timeout>30</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

    <distributable />

</web-app>

---- 업데이트 됨 ----

public class Bootstrap implements WebApplicationInitializer
{

    @Override
    public void onStartup(ServletContext container) throws ServletException
    {
        container.getServletRegistration("default").addMapping("/resource/*");

        AnnotationConfigWebApplicationContext rootContext =
            new AnnotationConfigWebApplicationContext();
        rootContext.register(RootContextConfiguration.class);
        container.addListener(new ContextLoaderListener(rootContext));

        AnnotationConfigWebApplicationContext webContext =
            new AnnotationConfigWebApplicationContext();
        webContext.register(WebServletContextConfiguration.class);
        ServletRegistration.Dynamic dispatcher = container.addServlet(
            "springWebDispatcher", new DispatcherServlet(webContext)
        );
        dispatcher.setLoadOnStartup(1);
        dispatcher.setMultipartConfig(new MultipartConfigElement(
            null, 20_971_520L, 41_943_040L, 512_000
        ));
        dispatcher.addMapping("/");

        AnnotationConfigWebApplicationContext restContext =
                new AnnotationConfigWebApplicationContext();
        restContext.register(RestServletContextConfiguration.class);
        DispatcherServlet servlet = new DispatcherServlet(restContext);
        servlet.setDispatchOptionsRequest(true);
        dispatcher = container.addServlet(
                "springRestDispatcher", servlet
        );
        dispatcher.setLoadOnStartup(2);
        dispatcher.addMapping("/rest/*");

        rootContext.refresh();
        DbBootstrap dbBootstrap = rootContext.getBean(DbBootstrap.class);
        dbBootstrap.init();

    }


}

게시물 요청을 수행 할 때 (우편 배달부 사용)

HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:Expected MultipartHttpServletRequest: is a MultipartResolver configured 

나는 stackoverflow 이상 몇 가지 비슷한 질문을 보았다하지만 아무도 도움이 나를.

봄 버전 : 4.0.4

어떤 도움이라도 대단히 감사하겠습니다 (물론 엄지 손가락으로).

감사

해결법

  1. ==============================

    1.왜 이렇게했는지 모르겠지만 컨텍스트의 MultipartResolver 빈은 multipartResolver라는 이름이어야합니다. @Bean 메소드의 이름을

    왜 이렇게했는지 모르겠지만 컨텍스트의 MultipartResolver 빈은 multipartResolver라는 이름이어야합니다. @Bean 메소드의 이름을

    public CommonsMultipartResolver multipartResolver(){ // lowercase 'P'
    

    또는 명시 적으로 이름을 지정하십시오.

    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver canBeCalledAnything(){
    
  2. ==============================

    2.

    allowCasualMultipartParsing="true"
    

    context.xml 안의 컨텍스트 태그에, 그것은 저에게 맞습니다.

  3. ==============================

    3.멀티 파트 구성이없는 것은 예외입니다. 비록 당신이 multipartResolver 빈을 제공했다.

    멀티 파트 구성이없는 것은 예외입니다. 비록 당신이 multipartResolver 빈을 제공했다.

    문제는 Spring Security 필터 전에 MultipartFilter를 지정하는 동안 multipartResolver 빈을 얻으려고 시도하지만 찾을 수 없다는 것입니다. 왜냐하면 그것은 bean name / id가 multipartResolver 대신에 filterMultipartResolver로 기대하기 때문이다.

    너 자신에게 호의를 베풀어 라. 다음과 같이 빈 구성을 변경하십시오.

    @Bean
    public CommonsMultipartResolver filterMultipartResolver(){
        CommonsMultipartResolver resolver = new 
        CommonsMultipartResolver();
        return resolver;
    }
    

    또는

    @Bean(name = "filterMultipartResolver")
    public CommonsMultipartResolver multiPartResolver(){
        CommonsMultipartResolver resolver = new 
        CommonsMultipartResolver();
        return resolver;
    }
    
  4. ==============================

    4.R. Ali Ashik의 답변이 나를 위해 일했습니다.

    R. Ali Ashik의 답변이 나를 위해 일했습니다.

    다음은 내가 작업하고있는 프로젝트의 pom.xml과 관련된 부분입니다.

    영구 인증 설정을 사용하는 사용자 정의 로그인 페이지가 있으므로 다음과 같은 정보도 필요합니다.

    public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    
            @Override
            protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
                insertFilters(servletContext, new MultipartFilter());
            }
        }
    

    그러나 R. Ali Ashik이 지적한 바와 같이 실제 클린 처 (clinther)

    @Bean(name = "filterMultipartResolver")
    public CommonsMultipartResolver multiPartResolver(){
        CommonsMultipartResolver resolver = new 
        CommonsMultipartResolver();
        return resolver;
    }
    

    관련 참조 자료는 다음과 같습니다. 클래스 MultipartFilter

    관련 텍스트는 다음과 같습니다.

    Looks up the MultipartResolver in Spring's root web application context. Supports a "multipartResolverBeanName" filter init-param in web.xml; the default bean name is "filterMultipartResolver". Looks up the MultipartResolver on each request, to avoid initialization order issues (when using ContextLoaderServlet, the root application context will get initialized after this filter).
    
  5. from https://stackoverflow.com/questions/24265573/unable-to-process-parts-as-no-multi-part-configuration-has-been-provided by cc-by-sa and MIT license