0

私は知識を春に移しているのですが、これがどのように機能しているかはよくわかりません。私はそれを機能させるために非常に基本的な例を作ろうとしていますが、それを機能させることができませんでした:-((

ApplicationContext.xml

<bean id="serviceTest" class="es.mov.jose.agenda.ServiceTest">
</bean>

    <bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovility">
    <property name="serviceTest" ref="serviceTest" />
</bean>

    <bean name="/jose/req1.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    <property name="viewName" value="jose/req1" />
</bean>

ServiceMovility.java

package es.mov.jose.agenda;

public interface ServiceMovility {
        public String callTest();
}

ServiceMovilityImpl.java

package es.mov.jose.agenda;

import es.mov.jose.agenda.ServiceMovility;

public class ServiceMovilityImpl implements ServiceMovility {

    private ServiceTest serviceTest;    
    public String callTest() {
        return serviceTest.getValue();
    }

}  

ServiceTest.java

package es.mov.jose.agenda;

public interface ServiceTest {
        public String getValue();
}    

ServiceTestImpl.java

package es.mov.jose.agenda;

import es.mov.jose.agenda.ServiceTest;

public class ServiceTestImpl implements ServiceTest {

    public String getValue() {
        return "OK";
    }

}

そして最後に私のreq1.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="es.mov.jose.agenda.ServiceMovility"%>
<%@ page import="es.mov.jose.agenda.ServiceMovilityImpl"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib prefix="sp-forms" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">    
</head>
<body>
<jsp:useBean id="serviceMovility" scope="request"     class="es.mov.jose.agenda.ServiceMovilityImpl" />
<div class="main" >
    <%
    String result = serviceMovility.callTest();
    out.println(result);
    %>
</div>
</body>
</html>

serviceMovilityを完全に呼び出しますが、callTestメソッド内でserviceTestの呼び出しに失敗し、java.lang.NullPointerExceptionと表示されます。¿そのようにBean serviceMovilityをjspファイルに含める必要がありますか?¿なぜ春はserviceMovilityで初期化されたserviceTestを注入しないのですか?

私はこれに2日間を費やしましたが、すべての解決策に失敗しました。どうしたらいいのかわからない。

前もって感謝します。

4

2 に答える 2

0

Beanを定義するときに、インターフェースの代わりに実装を使用します。

<bean id="serviceTest" class="es.mov.jose.agenda.ServiceTestImpl" />

<bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovilityImpl">
  <property name="serviceTest" ref="serviceTest" />
</bean>

<bean name="/jose/req1.do"
    class="es.mov.jose.agenda.Req1Controller">
  <property name="viewName" value="jose/req1" />
  <property name="serviceMovility" ref="serviceMovility" />
</bean>

さらに、* Implクラスでは、注入された依存性へのセッターを定義しますServiceMovilityImpl

public void setServiceTest(ServiceTest serviceTest) {
  this.serviceTest = serviceTest;
}

編集

あなたはそれを間違っています...JSPに(を介してjsp:useBean)Beanを注入するのではなく、直接Controllerに注入します。独自のコントローラーを定義します。

package es.mov.jose.agenda;

final class Req1Controller extends ParameterizableViewController {

  private ServiceMovility serviceMovility;

  @Override
  protected ModelAndView handleRequestInternal(HttpServletRequest request,
      HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView(getViewName());
    mav.addObject("callTest", serviceMovility.callTest());
    return mav;
  }

  public void setServiceMovility(ServiceMovility serviceMovility) {
    this.serviceMovility = serviceMovility;
  }
}

ApplicationContext.xml上記のように編集し(Req1Controller代わりに使用ParameterizableViewController)、JSPでは次の${callTest}変数を使用します。

<body>
  <div class="main" >
    <c:out value="${callTest}" />
  </div>
</body>
于 2012-09-12T12:16:08.313 に答える
0

いくつかのこと:

インターフェイスのインスタンスを作成することはできません。

<bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovility">
it shout be
<bean id="serviceMovility" class="es.mov.jose.agenda.ServiceMovilityImpl">

ServiceMovilityImplは、フィールドのsetメソッドを定義する必要があります。これを機能させるには:

<property name="serviceTest" ref="serviceTest" />

これを行う:

package es.mov.jose.agenda;

import es.mov.jose.agenda.ServiceMovility;

public class ServiceMovilityImpl implements ServiceMovility {

    private ServiceTest serviceTest;    

    public void setServiceTest(ServiceTest serviceTest){
        this.serviceTest = serviceTest;
    }

    public String callTest() {
        return serviceTest.getValue();
    }

}  
于 2012-09-12T12:16:53.670 に答える