У меня есть бэкэнд Spring 4 с конечными точками REST, чтобы попасть с моего фронтального угла AngularJS. Проблема в том, что всякий раз, когда я удаляю эти конечные точки с моего внешнего конца, запрос возвращает значение 404.404 от Spring 4 Конечная точка REST
Я смотрел в файле журнала приложения, когда я запускаю Tomcat, сопоставления URL-адреса REST корректно сопоставляются обработчику с помощью Spring. Вот точная строка, показывающая URL-адрес, который я пытаюсь ударить, отображается.
2015-11-27 09:16:50,885 RMI TCP Connection(4)-127.0.0.1 INFO annotation.RequestMappingHandlerMapping Mapped
"{[/rest/userAccount/createAccount],methods=[POST]}" onto public
Я пробовал попасть в конечную точку с помощью приложения тестирования REST, и он возвращает то же самое. Так что это не что-то не так с моим угловым передним концом. Для справки, точную конечную точку, которую я пытаюсь сделать, это /gravytrack/rest/userAccount/createAccount
.
Вот мои пружинные конфигурационные файлы:
web.xml
<web-app 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">
<!-- Log4j configuration loading -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.xml</param-value>
</context-param>
<!-- Bootstrapping context loading -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/gravytrack-servlet.xml
/WEB-INF/gravytrack-services.xml
<!--/WEB-INF/gravytrack-security.xml-->
</param-value>
</context-param>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>gravytrack.root</param-value>
</context-param>
<!-- session management listener -->
<!--<listener>-->
<!--<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>-->
<!--</listener>-->
<session-config>
<!-- session times out if no activities for 30 minutes -->
<session-timeout>30</session-timeout>
</session-config>
<!-- defining the DispatcherServlet -->
<servlet>
<servlet-name>gravytrack</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>gravytrack</servlet-name>
<url-pattern>/rest/**</url-pattern>
</servlet-mapping>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
<welcome-file-list>
<welcome-file>
/index.html
</welcome-file>
</welcome-file-list>
</web-app>
gravytrack-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- the application context definition for the GravyTrack DispatcherServlet -->
<context:component-scan base-package="com.gbsolutions.gravytrack.web" />
<context:component-scan base-package="com.gbsolutions.gravytrack.service" />
<context:component-scan base-package="com.gbsolutions.gravytrack.model" />
<!--<context:component-scan base-package="com.gbsolutions.gravytrack.security" />-->
<context:annotation-config />
<mvc:annotation-driven />
<!--<mvc:view-controller path="/dashboard" view-name="dashboard"/>-->
<!--<mvc:view-controller path="/login" view-name="login"/>-->
<mvc:resources mapping="/webjars/**" location="classpath:/webjars/"/>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:/messages/messages</value>
<value>classpath:/messages/errors</value>
<value>classpath:/jdbc.properties</value>
<value>classpath:/gravytrack.properties</value>
</list>
</property>
<property name="cacheSeconds" value="1"/>
</bean>
<!--<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">-->
<!--<property name="order" value="0" />-->
<!--<property name="viewClass"-->
<!--value="org.springframework.web.servlet.view.JstlView" />-->
<!--<property name="prefix" value="/WEB-INF/jsp/" />-->
<!--<property name="suffix" value=".jsp" />-->
<!--</bean>-->
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="1" />
<property name="contentNegotiationManager">
<bean class="org.springframework.web.accept.ContentNegotiationManager">
<constructor-arg>
<list>
<bean
class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
<constructor-arg>
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
<entry key="html" value="text/html" />
</map>
</constructor-arg>
</bean>
<bean
class="org.springframework.web.accept.HeaderContentNegotiationStrategy" />
</list>
</constructor-arg>
</bean>
</property>
<property name="defaultViews">
<list>
<!-- JSON View -->
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />
<!-- XML View -->
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="packagesToScan">
<list>
<value>com.gbsolutions.gravytrack.model.domain</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
</bean>
</beans>
UserAccountController
package com.gbsolutions.gravytrack.web;
import com.gbsolutions.gravytrack.model.domain.UserAccount;
import com.gbsolutions.gravytrack.service.manager.UserAccountManager;
import com.gbsolutions.gravytrack.service.validator.CreateUserAccountValidator;
import com.gbsolutions.gravytrack.web.dto.GenericJsonDTO;
import com.gbsolutions.gravytrack.web.dto.JsonFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
@Controller
@RequestMapping("/rest/userAccount")
@SessionAttributes("userAccount")
public class UserAccountController {
@RequestMapping(value="/createAccount", method = RequestMethod.POST)//, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public GenericJsonDTO createAccount(@RequestBody UserAccount userAccount, BindingResult result, SessionStatus status){
JsonFactory jsonFactory = new JsonFactory(result, "/gravytrack/dashboard");
validator.validate(userAccount, result);
if(!result.hasErrors()) {
userAccountManager.createUserAccount(userAccount);
status.setComplete();
}
return jsonFactory.getDto();
}
@RequestMapping(value="/signIn", method = RequestMethod.POST)//, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public GenericJsonDTO signIn(@RequestBody UserAccount userAccount, BindingResult result, SessionStatus status){
System.out.println("signIn entered!");
JsonFactory jsonFactory = new JsonFactory(result, "/gravytrack/dashboard");
validator.validate(userAccount, result);
if(!result.hasErrors()) {
userAccountManager.createUserAccount(userAccount);
status.setComplete();
}
return jsonFactory.getDto();
}
}
Это приложение, которое я конвертирован от использования JSP, чтобы Угловой. Поэтому мне пришлось изменить конфигурационные файлы, потому что он больше не нуждается в настройке.
Как вы можете видеть в web.xml и gravytrack-servlet.xml, я закомментировать несколько строк, которые я не думаю, были нужны. Я прокомментировал любую ссылку на Spring Security полностью, потому что мне нужно будет установить это, как только я получу эту работу.
Я пытался изменить свою конфигурацию по-разному, но ничего не работает. Что может быть причиной проблемы здесь?
Что такое URL в интерфейсе angularjs? (для просмотра контекстного пути) – burna
Я обращаюсь к приложению на 'https: // localhost: 8443/gravytrack', который переводит меня на' https: // localhost: 8443/gravytrack/#/login'. Приложение отображается хорошо. У меня его нет в папке '/ webapp/WEB-INF'. Все файлы переднего конца находятся в папке '/ webapp'. Конечный результат, который я пытаюсь нажать, находится на 'https: // localhost: 8443/gravytrack/rest/userAccount/createAccount'. – Graham
> Для справки, точную конечную точку, которую я пытаюсь нажать, это >/gravytrack/rest/userAccount/createAccount. Не должно быть «/ rest/userAccount/createAccount»? –