Spring MVC가 404로 응답하여 "No mapping found for HTTP request with URI [...in Dispatcher Servlet]?"라고 보고하는 이유는 무엇입니까?
Tomcat에 전개된 Spring MVC 어플리케이션을 쓰고 있습니다.다음의 최소, 완전, 검증 가능한 예를 참조해 주세요.
public class Application extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { };
}
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { SpringServletConfig.class };
}
protected String[] getServletMappings() {
return new String[] { "/*" };
}
}
서 ★★★★★SpringServletConfig하고 있다
@Configuration
@ComponentScan("com.example.controllers")
@EnableWebMvc
public class SpringServletConfig {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
}
는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.@Controllercom.example.controllers
@Controller
public class ExampleController {
@RequestMapping(path = "/home", method = RequestMethod.GET)
public String example() {
return "index";
}
}
어플리케이션의 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」Example
http://localhost:8080/Example/home
응용 프로그램은 HTTP Status 404로 응답하고 다음 로그를 기록합니다.
WARN o.s.web.servlet.PageNotFound - No mapping found for HTTP request with URI `[/Example/WEB-INF/jsps/index.jsp]` in `DispatcherServlet` with name 'dispatcher'
JSP에 ./WEB-INF/jsps/index.jspSpring MVC는 컨트롤러를 사용하여 요구를 처리하고 JSP로 전송할 것으로 예상했는데 왜 404로 응답합니까?
이 경고 메시지에 대한 질문을 위한 정식 게시물입니다.
표준 Spring MVC 응용 프로그램은 Servlet 컨테이너에 등록된를 통해 모든 요청을 처리합니다.
DispatcherServlet을 보다ApplicationContext 가능한 는, 「」를 해 주세요.ApplicationContext 등록되어 .ContextLoaderListener특수 콩의 경우 요청 서비스 로직을 설정해야 합니다.이러한 콩에 대해서는 설명서에 설명되어 있습니다.
틀림없이 가장 중요한 타입 맵은
및 및 한 것은, 「」에 의해서 .상세한 것에 의해서 다릅니다.
HandlerMapping를 지원하지만 가장 일반적인 구현은 주석이 달린 컨트롤러를 지원하지만 다른 구현도 있습니다.
의 javadoc에서는 구현이 어떻게 동작해야 하는지 자세히 설명합니다.
DispatcherServlet는 이 유형의 모든 콩을 검색하여 일정한 순서로 등록합니다(커스터마이즈 가능)., 「 」는, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」가 됩니다DispatcherServlet를 통과합니다.HandlerMapping오브젝트 및 각 오브젝트를 사용하여 테스트하여 표준으로 표시되는 착신 요구를 처리할 수 있는 오브젝트를 찾습니다.HttpServletRequest. 4 . 3 . x of of 、 아무것도 검출되지 않으면 표시되는 경고를 로그에 기록합니다.
를 사용하는 요청에 대한 수 .
[/some/path]DispatcherServletSomeName SomeName 라 with with with with
를 슬로우하거나 404 Not Found 상태 코드로 즉시 응답을 커밋합니다.
ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ?DispatcherServletHandlerMapping제청 처리 리리 리? ???
일반적인 ★★★★★★★★★★★★★★★★★★★」HandlerMapping실장은 입니다.이것에 의해, 등록이 처리됩니다.@Controller콩는 콩)@RequestMapping이런 은 본인이 신고할 수 .@Bean ★★★★★★★★★★★★★★★★★」<bean>또는 기타 메커니즘) 또는 내장 옵션을 사용할 수 있습니다.다음과 같습니다.
- ★★★에 을 달아 .
@Configuration의@EnableWebMvc. <mvc:annotation-driven />구성원을 지정합니다.
기재되어 , 양쪽 「」, 「」, 「」, 「합니다.RequestMappingHandlerMapping a, a.HandlerMapping을 사용법 RequestMappingHandlerMapping@Controller.@Bean 또는 설정에서의 <bean> 또는 선언@Controller주석 첨부 클래스 중 하나.이 콩들이 있는지 확인하세요.
경고 메시지와 404가 표시되고 위의 모든 것이 올바르게 설정되어 있는 경우, 검출된 URI에 의해 처리되지 않는 URI로 요구를 송신하고 있는 것입니다.@RequestMapping주석 핸들러 메서드.
spring-webmvc는 기타 "Built-in"을 합니다.HandlerMapping실장.예를 들어, maps는
슬래시("/")로 시작하는 이름의 URL에서 콩으로
그리고 넌 항상 네 것을 쓸 수 있어.보내는 요청이 등록된 개체의 핸들러 중 하나 이상과 일치하는지 확인해야 합니다.
으로 또는 HandlerMapping콩(혹은 있는 경우)trueDispatcherServlet는 몇 가지 기본값을 등록합니다.이것들은, 에 정의되어 있습니다.패키지내에서 정의되어 있습니다.DispatcherServlet 그들은BeanNameUrlHandlerMapping및 (와 유사)RequestMappingHandlerMapping아, 아, 아, 아, 아, 아, 아, 맞다.
디버깅
MVC는 Spring MVC를 통해 합니다.RequestMappingHandlerMapping를 들어, '예'라고 하는 @Controller
@Controller
public class ExampleController {
@RequestMapping(path = "/example", method = RequestMethod.GET, headers = "X-Custom")
public String example() {
return "example-view-name";
}
}
다음 로그를 INFO 레벨로 기록합니다.
Mapped "{[/example],methods=[GET],headers=[X-Custom]}" onto public java.lang.String com.spring.servlet.ExampleController.example()
등록된 매핑에 대해 설명합니다.핸들러를 찾을 수 없다는 경고가 표시되면 메시지 내의 URI를 여기에 나열된 매핑과 비교합니다.Spring MVC가 핸들러를 선택하려면 에서 지정된 모든 제한이 일치해야 합니다.
other.HandlerMapping구현에서는 매핑과 대응하는 핸들러에 힌트를 주는 독자적인 스테이트먼트를 기록합니다.
마찬가지로 스프링 로깅을 DEBUG 수준에서 활성화하여 스프링이 어떤 콩을 등록하는지 확인합니다.검색한 주석 첨부 클래스, 검색한 패키지 및 초기화된 콩을 보고해야 합니다..ApplicationContext★★★★★★ 。
기타 일반적인 실수
A DispatcherServlet일반적인 Java EE에 등록합니다.<web.xml> <servlet-class> ★★★★★★★★★★★★★★★★★」<servlet-mapping>선언, 또는 직접 또는 스프링부트가 사용하는 메커니즘에 따라 결정됩니다.따라서 Servlet 사양에 지정된 URL 매핑 로직을 사용해야 합니다. 12장을 참조하십시오.「 」를 참조해 주세요.
에 두고 등록하는 입니다.DispatcherServlet의 URL /* 、 , 、 , 、 [ 。@RequestMappingJSP에 관한 정보입니다.를 들어, 취급법을 .
@RequestMapping(path = "/example", method = RequestMethod.GET)
public String example() {
return "example-view-name";
}
와 함께
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
패스의 JSP 리소스로 요구가 전송될 것으로 예상할 수 있습니다./WEB-INF/jsps/example-view-name.jsp콘텍스트 이름을 '콘텍스트 이름'으로 합니다.Example , . . . . . . . .DisaptcherServlet할 것이다
를 사용하는 요청에 대한 수 .
[/Example/WEB-INF/jsps/example-view-name.jsp]DispatcherServlet라는
냐하 because는DispatcherServlet는 에 있습니다./* ★★★★★★★★★★★★★★★★★」/*는 모든에 일치합니다(priority가).DispatcherServlet을 처리하기 위해 선택될 것이다.forward에서 (에 의해)InternalResourceViewResolver)는, 거의 모든 경우에, 는 이러한 요구를 처리하도록 설정되어 있지 않습니다.
간단한 에는 '아', '아', '아', '아', '아', '아, 아',DispatcherServlet로로 합니다./이치노기본 서블릿은 요청의 마지막 일치입니다.를 통해 서블릿 구현을 선택할 수은 " "에 매핑됩니다.*.jsp기본 서블릿을 사용하기 전에 JSP 리소스(예를 들어 Tomcat )를 처리합니다.
이것이 예에서 볼 수 있는 내용입니다.
이전에 설명한 것 외에 문제를 해결했습니다.`
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/jsps/");
vr.setSuffix(".jsp");
return vr;
}
added tomcat-embed-jasper:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
from: 스프링 부트 웹 응용 프로그램에서 JSP 파일이 렌더링되지 않음
이 경우 버전 5.1.2의 인터셉터 스프링 매뉴얼을 따르고 있었습니다(Spring Boot v2.0.4 사용 중).릴리스) 및WebConfig 있었다@EnableWebMvc어플리케이션의 다른 것과 경합하고 있어 스태틱애셋이 올바르게 해결되지 않는 것 같습니다(즉, 클라이언트에 CSS 또는 JS 파일이 반환되지 않는 것).
여러 가지 시도를 한 후, 저는 이 버팀목을 제거하려고 했습니다.@EnableWebMvc리고고 그과효효 !었!!!!
편집: 다음 참조 매뉴얼에서는 이 문서를 삭제해야 합니다.@EnableWebMvc
이미 것 단, 스프링 어플리케이션을 사용하는 만).web.xml다른 정적 파일도 프로그래밍 방식으로 되어 있기 때문에 충돌이 있었습니다.
컨피규레이션파일을 다음과 같이 변경하여 코드를 수정해 보겠습니다. config 대신 됩니다.application.properties. 에서하게 하는 말아 configureDefaultServletHandling★★★★★★ 。
WebMvcConfigurerAdapter되지 않기 에 '클래스'를 합니다.WebMvcConfigurer인터페이스입니다.
@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
gradle, gradle, gradle, gradle, , gradle, gradle, gradle, gradle, gradle, gradle, gradle, gradle, gradle, gradle, , gradle, gradle, gradle, gradlepom.xml:
dependencies {
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.0.RELEASE'
compile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '9.0.35'
}
나는 같은 오류의 다른 이유를 발견했다.또한 controller.java 파일에 대해 클래스 파일이 생성되지 않았기 때문일 수도 있습니다.그 결과 web.xml에 기재되어 있는 디스패처서블릿은 컨트롤러 클래스의 적절한 메서드에 매핑할 수 없습니다.
@Controller
Class Controller{
@RequestMapping(value="/abc.html")//abc is the requesting page
public void method()
{.....}
}
[ Project ]-> [ Clean ]-> [ Build Project ]를 선택합니다.작업영역의 빌드에서 컨트롤러 파일에 대해 클래스 파일이 생성되었는지 확인하십시오.
저는 대상 클래스가 소스와 다른 폴더 패턴으로 생성되었음을 발견했습니다.컨트롤러가 들어 있는 폴더를 추가하고 패키지로 추가하지 않습니다.그래서 스프링 구성에서 잘못된 경로를 정의하게 되었습니다.
나의 목표수업은 앱으로 수업을 생성하는 것이었고 나는 com을 언급하고 있었다.happy.app
<context:annotation-config />
<context:component-scan
base-package="com.happy.app"></context:component-scan>
com용 패키지(폴더 아님)를 추가했습니다.happy.app을 사용하여 파일을 폴더에서 패키지로 이동하면 문제가 해결됩니다.
서버를 청소합니다.서버를 삭제하고 프로젝트를 한 번 더 추가한 후 실행하세요.
Tomcat 서버를 중지합니다.
서버를 오른쪽 클릭하여 [Clean]를 선택합니다.
서버를 다시 마우스 오른쪽 버튼으로 클릭하고 "Clean Tomcat Work Directory"를 선택합니다.
제 경우 secondary java config 파일을 메인 java config 파일로 Import하면서 놀고 있었습니다.세컨더리 컨피규레이션파일을 작성할 때 메인 컨피규레이션클래스의 이름을 변경했는데 web.xml의 이름을 갱신하지 못했습니다.따라서 Tomcat 서버를 재시작할 때마다 Eclipse IDE 콘솔에 매핑핸들러가 표시되지 않고 홈 페이지로 이동하려고 하면 다음 오류가 나타납니다.
2019년 11월 1일 11:00:01 PM org.spring framework.web.servlet.PageNotFound noHandlerFound 경고: DispatcherServlet에서 URI [/webapp/home/index]를 사용하는 HTTP 요청에 대한 매핑을 찾을 수 없습니다.
수정은 web.xml 파일을 업데이트하여 이전 이름 "WebConfig"가 "MainConfig"가 되도록 하고 메인 Java 구성 파일의 최신 이름을 반영하도록 이름을 변경하는 것이었습니다(여기서 "MainConfig"는 임의이며 "Web" 및 "Main"은 구문 요건이 아닙니다).MainConfig는 중요했습니다.왜냐하면 MainConfig는 웹 요청을 처리하는 봄철 MVC 컨트롤러 클래스인 "WebController"의 컴포넌트를 스캔한 파일이기 때문입니다.
@ComponentScan(basePackageClasses={WebController.class})
web.xml에는 다음이 있습니다.
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
com.lionheart.fourthed.config.WebConfig
</param-value>
</init-param>
web.xml 파일에는 다음과 같은 기능이 있습니다.
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
com.lionheart.fourthed.config.MainConfig
</param-value>
</init-param>
콘솔 창에 매핑이 표시됩니다.
정보: 지도 "{[/home/index],maps=[GET]}"를 public org.springframework에 추가합니다.web.servlet.ModelAndView com.lionheart.포티드 컨트롤러WebController.gotoIndex()
그리고 내 웹페이지가 다시 로딩되고 있어.
저는 이 문제가 web.xml 파일에 숨겨져 있었습니다.
서블릿 태그에는 다음과 같은 것이 있습니다.
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/todo-servlet.xml</param-value>
</init-param>
해 주세요.<param-value>디스패처 서블릿(프론트 컨트롤러라고도 함)의 올바른 위치를 유지했습니다.
위치를 잘못 알고 있었기 때문에 홈페이지를 볼 수 있었지만, 다른 페이지는 모두 HTTP 404 에러가 발생하고 있었습니다.
제 경우 Config.java(클래스)와 config.xml을 작성했으며 매핑은 양쪽에서 부분적으로 수행되었습니다.또한 config.java는 @Configuration 주석을 사용하기 때문에 priority로 간주되었습니다.config.xml은 고려되지 않았습니다.이와 같은 문제가 발생한 경우 주석과 함께 config.java를 삭제하고 config.xml을 유지하려고 하면 정상적으로 동작합니다.
도 같은 요.**No mapping found for HTTP request with URI [/some/path] in DispatcherServlet with name SomeName**
2일에서 4일 정도 분석을 한 결과 근본 원인을 알 수 있었습니다.프로젝트를 실행한 후 클래스 파일이 생성되지 않았습니다.프로젝트 탭을 클릭했습니다.
프로젝트 -->프로젝트 닫기 -->프로젝트 열기 --> 청소 -->프로젝트 빌드
소스 코드에 대한 클래스 파일이 생성되었습니다.그것으로 내 문제가 해결되었다.클래스 파일이 생성되었는지 여부를 확인하려면 프로젝트 폴더의 빌드 폴더를 확인하십시오.
따라서 문제는 프로젝트 진행 경로에 추가 공간을 추가하는 것만큼 단순할 수 있습니다.제가 해결하는데 꽤 시간이 걸렸던 경로에 공간이 없는지 확인해 주세요.
언급URL : https://stackoverflow.com/questions/41577234/why-does-spring-mvc-respond-with-a-404-and-report-no-mapping-found-for-http-req
'codememo' 카테고리의 다른 글
| JSON Schema를 사용하여 두 필드 중 하나를 요구하는 방법 (0) | 2023.02.08 |
|---|---|
| WooCommerce:쿠폰이 유효한지 확인하십시오. (0) | 2023.02.08 |
| cURL에서 JSON 데이터를 POST 하려면 어떻게 해야 하나요? (0) | 2023.02.08 |
| 페이지가 맨 아래에 로드되는 이유를 알 수 없습니까?각도 UI 라우터 자동 스크롤 문제 (0) | 2023.02.08 |
| 다시 열고 이미 부트스트랩된 응용 프로그램에 종속성을 추가합니다. (0) | 2023.02.08 |