2014-12-04 3 views
0

У меня есть проект весны, и все работает отлично.Весна не может скомпилировать jsp с javax.servlet

Мои Gradle зависимостей компиляции имеет следующие

compile 'org.springframework:spring-core:4.1.2.RELEASE', 
     'org.springframework:spring-web:4.1.2.RELEASE', 
     'org.springframework:spring-webmvc:4.1.2.RELEASE', 
     'org.springframework:spring-orm:4.1.2.RELEASE', 
     'org.springframework:spring-context:4.1.2.RELEASE', 
     'org.springframework:spring-tx:4.1.2.RELEASE', 
     'commons-dbcp:commons-dbcp:1.4', 
     'mysql:mysql-connector-java:5.1.6', 
     'org.hibernate:hibernate-core:4.3.7.Final' 

И мой web.xml является

<web-app 
    id="WebApp_ID" 
    version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
    http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>Test Restful Application</display-name> 

    <servlet> 
     <servlet-name>test-servlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>test-servlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/test-servlet.xml</param-value> 
    </context-param> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 

    <welcome-file-list> 
     <welcome-file>/WEB-INF/view/default.jsp</welcome-file> 
    </welcome-file-list> 

    <error-page> 
     <error-code>404</error-code> 
     <location>/WEB-INF/view/default.jsp</location> 
    </error-page> 

</web-app> 

И бобы

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="com.example" /> 

    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/pages/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     id="dataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" 
      value="jdbc:mysql://localhost:3306/test" /> 
     <property name="username" value="root" /> 
     <property name="password" value="password" /> 
    </bean> 

    <bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     id="sessionFactory"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
    </bean> 

    <tx:annotation-driven /> 
    <bean class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
     id="transactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <bean class="com.example.dao.TestDAO" id="testDAO"> 
     <constructor-arg ref="sessionFactory" /> 
    </bean> 

</beans> 

И все работало просто замечательно.

Однако я хотел посмотреть, могу ли я получить IP-адрес посетителей.

Так что я посмотрел и обнаружил, что мне нужно использовать HttpServletRequest и использовать, что мне нужно javax.servlet так я изменил gradle.build и добавил 'javax.servlet:servlet-api:2.5'. Я не изменил ни одной строки кода, кроме build.gradle, и теперь я получаю HTTP Status 500 - Unable to compile class for JSP:org.apache.jasper.JasperException: Unable to compile class for JSP:

Может ли кто-нибудь объяснить, почему и как я это получил, и почему это и как я могу это исправить? Для меня не имеет смысла, как добавление одной библиотеки может заставить все перестать работать.

Спасибо всем за помощь, я теряю рассудок, не имея возможности найти решение.

EDIT:

Это трассировки стека

Stacktrace:] with root cause 
org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: [42] in the generated java file: [system\tomcat\Tomcat_(1)_web\work\Catalina\localhost\ROOT\org\apache\jsp\WEB_002dINF\view\default_jsp.java] 
The method getDispatcherType() is undefined for the type HttpServletRequest 

Stacktrace: 
    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103) 
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:199) 
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:450) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:361) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:336) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:323) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

По-видимому, рассматривает СПЯ, как .java файл.

EDIT2:

Это мой файл JSP

<html> 
<head> 
    <title>Error</title> 
</head> 
<body> 
<h3>Wrong page</h3> 
</body> 
</html> 
+0

Просьба показать остальную трассировку стека –

+0

Вы должны быть в состоянии найти фактические ошибки компиляции JSP в файле журнала. –

ответ

1

Как исправить: верните свои изменения. У вас уже есть зависимость от javax.servlet.

javax.servlet:javax.servlet-api:3.0.1 - это зависимость от org.springframework:spring-web:4.1.2.RELEASE (см. Раздел «Зависит от»), поэтому он доступен для вас как транзитивная зависимость.

Почему у вас есть это: у вас есть две конфликтующие зависимости одного и того же баннера (HttpServletRequest в Servlet API 3.0 имеет getDispatcherType(), а в API 2.5 - нет). От Gradle User Guide:

Конфликтующие версии одного и того же баночке должны быть обнаружены и либо решены или вызвать исключение. Если вы не используете управление транзитивной зависимостью , конфликты версий не обнаружены, и часто случайно порядок пути к классам определит, какая версия зависимости победит. В большом проекте со многими разработчиками, изменяющими зависимости , успешных сборок будет немного и далеко друг от друга, так как порядок зависимостей может напрямую влиять на успех сборки или (или ошибка появляется или исчезает в процессе производства).

+0

Wow thanks. Не понял, что – Quillion

0

"По-видимому, рассматривает СПЯ, как .java файл.".

Нет. Это переводит JSP на Java и затем компилирует это. Если ваш JSP содержит ошибки, то вполне вероятно, что эти ошибки приведут к Java-коду с ошибками компиляции.

Что вам нужно сделать, это посмотреть на сгенерированный исходный код JSP и выяснить, что говорят ошибки компиляции Java. Затем выясните соответствующую ошибку в вашем JSP и устраните проблему.

В этом случае кажется, что ваш JSP пытается вызвать несуществующий метод на объекте request. Компилятор прав. В API HttpServletRequest нет метода, называемого getDispatcherType(), поэтому ваш код JSP, который пытается его вызвать, неверен.

+0

Я отредактировал вопрос и добавил файл jsp. Неужели что-то такое, что я делаю, так неправильно? – Quillion

+0

Вы уверены, что у вас есть правильный JSP-файл? Имеет ли он какое-либо сходство с файлом 'default_jsp.java', о котором говорит компилятор? –

+0

Да, мой default.jsp покажет страницу с ошибкой. Вот почему я сопоставил его с ошибкой на странице 404 в моем web.xml. Вот почему я озадачен. Код, который у меня есть, на самом деле не такой сложный, поэтому я не понимаю, почему он не работает. – Quillion

Смежные вопросы