2014-11-19 4 views
0

В прошлом я делал несколько простых SOAP-сервисов, используя Spring и IOC (application-context.xml, где я указываю, что мой контроллер имеет 2 разных DAO и т. Д., И Spring устанавливает их для меня)Служба REST REST с IOC?

Теперь я пытаюсь служба REST с использованием Spring.

Мой контроллер выглядит следующим образом

@RestController 
@RequestMapping("/") 
public class MyController { 

private MyDAO1 myDAO1; 
private MyDAO2 myDAO2; 

@RequestMapping("/name") 
public MyTest getGreeting() { 
    MyTest tst = new MyTest(1, "Hallo "); 
    return tst; 
} 


public void setMyDAO1(MyDAO1 myDAO1) { 
    this.myDAO1 = myDAO1; 
} 

public void setMyDAO2(MyDAO2 myDAO2) { 
    this.myDAO2 = myDAO2; 
} 

Мой покоя servlet.xml содержит следующее:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-4.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> 

<!-- Configure to plugin JSON as request and response in method handler --> 
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jsonMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<!-- Configure bean to convert JSON to POJO and vice versa --> 
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
</bean> 

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/InformixDB" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

<bean id="myDAO1" class="com.test.dao.MyDAO1"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 
<bean id="myDAO2" class="com.test.dao.MyDAO2"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 


<bean id="myController" class="com.test.controller.MyController"> 
    <property name="myDAO1" ref="myDAO1" /> 
    <property name="myDAO2" ref="myDAO2" /> 
</bean> 


<context:component-scan base-package="com.test.controller.myController" /> 
<mvc:annotation-driven /> 

Теперь я получаю ошибку

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'myController' bean method 
public com.test.entity.MyTest com.test.controller.MyController.getGreeting() 
to {[//name],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'myController' bean method 
public com.test.entity.MyTest com.test.controller.MyController.getGreeting() mapped. 

Когда я удалить RequestMapping аннотаций Я могу развернуть его на tomcat, но я не знаю, как вызвать услугу

org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/MyTestService/getGreeting] in DispatcherServlet with name 'rest' 

'отдыха' является сервлет отображение в web.xml

Что мне не хватает?

+0

Запрос должен быть '/ MyTestService/name', который является отображением в сопоставлении запросов. – fmodos

ответ

3

Вы загружаете вы контроллер дважды, и Spring пытается отобразить его дважды:

  • он объявлен в rest-servlet.xml
  • он находится как аннотированный контроллер, из-за @RestController аннотацию и тега <context:component-scan base-package="de.cat.auftrag.controller" /> в rest-servlet.xml

Вы должны либо:

  • удалить объявление <bean id="myController" ... из rest-servlet.xml, но вам придется autowire на объектах DAO
  • удалить <context:component-scan ... тега, если у вас нет какого-либо другого компонента для сканирования.
1

Зачем решать проблемы, которые Весна уже сделала для вас?

@Controller // << See Here 
@RequestMapping("/") 
public class MyController { 

@Autowired // << See Here 
private MyDAO1 myDAO1; 
@Autowired // << See Here 
private MyDAO2 myDAO2; 

@RequestMapping("/name") 
public MyTest getGreeting() { 
    MyTest tst = new MyTest(1, "Hallo "); 
    return tst; 
} 

Ваш адрес, скорее всего, последний пакет в базовом пакете. В этом случае http://url:8080/rest/controller

И удалить.

<bean id="myController" class="com.test.controller.MyController"> 
<property name="myDAO1" ref="myDAO1" /> 
<property name="myDAO2" ref="myDAO2" /> 
</bean> 

Если вы хотите узнать Весну ... вам нужно будет забрать свой яд. Перейти XML или аннотации. Смешивание двух - это рецепт очень продолжительного и изнурительного процесса обучения.

+0

Ответ Сергея Балесты сделал трюк для меня. Но я понимаю, что теперь я использую XML и аннотации. Что такое «лучший» способ делать вещи? XML или аннотации? – Diskutant

+0

@Diskutant: скорее вопрос мнения. Аннотации необходимы в контроллерах ('RequestMapping' ...). Для оставшейся части они одинаково полезны и полностью поддерживаются весной. –

+0

Я пытаюсь переключиться на аннотацию.Я аннотировал DAO в моем контроллере с помощью @Autowired, и он работает, но мои DAO расширяет NamedParameterJdbcDaoSupport, и DataSource также должен быть подключен. Ошибка: '" Не найден квалифицированный bean-тип типа [com.test.dao.MyDAO], найденный для зависимости: ожидается как минимум 1 компонент, который квалифицируется как кандидат autwire для этой зависимости. "' Если у меня есть это в моем rest-servlet.xml он работает нормально, но не должно быть ничего, кроме ' \t ' при использовании только аннотаций. правильно? – Diskutant

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