1

いくつかのトラブルがありました。@Named を使用したクラスは次のように機能します。

@Named
@SessionScoped
public class UserBean {

@Autowired
UserBo userBo;

public void setUserBo(UserBo userBo) {
    this.userBo = userBo;
}

public String printMsgFromSpring() {
    return userBo.getMessage();
}

}

しかし、これは機能せず、エラーが発生します:

javax.servlet.ServletException javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) 根本原因 java.lang.NullPointerException com.mkyong.UserBean.printMsgFromSpring(UserBean.java:24)

@ManagedBean
@SessionScoped
public class UserBean {

@Autowired
UserBo userBo;

public void setUserBo(UserBo userBo) {
  this.userBo = userBo;
}

public String printMsgFromSpring() {
  return userBo.getMessage();
}

}

xhtml ページ:

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml"   
  xmlns:h="http://java.sun.com/jsf/html">

<h:body>

    <h1>JSF 2.0 + Spring Example</h1>

    #{userBean.printMsgFromSpring()}


</h:body>

顔-config.xml :

   <?xml version="1.0" encoding="UTF-8"?>
  <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd"
version="2.1">

<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

    </faces-config>

サービス クラス:

@Named
public class UserBoImpl implements UserBo{

  public String getMessage() {
        return "JSF 2 + Spring Integration";

  }

}

web.xml:

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" version="2.5">

    <display-name>JavaServerFaces</display-name>

      <!-- Add Support for Spring -->
   <listener>
      <listener-class>
       org.springframework.web.context.ContextLoaderListener
       </listener-class>
   </listener>
   <listener>
      <listener-class>
       org.springframework.web.context.request.RequestContextListener
       </listener-class>
   </listener>

   <welcome-file-list>
        <welcome-file>default.xhtml</welcome-file>
    </welcome-file-list>

  <servlet>
    <servlet-name>facesServlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
   <servlet-name>facesServlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
   </servlet-mapping>

  </web-app>

applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

   <context:component-scan base-package="com.mkyong" />
     </beans>
4

2 に答える 2

1

JSF は を処理しません@Autowired@ManagedPropertyこれを次の例のように置き換える必要があります。

    @ManagedProperty(value="#{userBoSpringName}")
    UserBo userBo;

userBoSpringNameこれは、Spring コンテキスト ファイル内の Bean の名前に対応している必要があります。このオプションは、JSF マネージド Bean でのみ使用できます。

JSF 2.2 以降@Inject、JSF マネージド Bean で使用してリソース インジェクションを実行することもできます。

于 2013-10-15T00:16:03.907 に答える
0

あなたは私が間違っていると信じているいくつかの仮定をしました。Spring は注釈を読み取ることができますが、JSF DI コンテナーが注釈を読み取れる@Namedとは思えません。この場合InjectAutowired

@Named
@SessionScoped
public class UserBean {

    @Autowired
    UserBo userBo;

    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    public String printMsgFromSpring() {
        return userBo.getMessage();
    }
}

私は、Spring がUserBeanインスタンスを作成し (理由により)、 Bean@Namedを注入していると考えています (これもクラスからのものです)。春は無視します。UserBo@NamedSessionScoped

ただし、この場合、

@ManagedBean
@SessionScoped
public class UserBean {
    @Autowired
    UserBo userBo;

    public void setUserBo(UserBo userBo) {
      this.userBo = userBo;
    }

    public String printMsgFromSpring() {
      return userBo.getMessage();
    }
}

あなたの JSF コンテナがこの Bean を作成していると思いますが、それが何で@Autowiredあるかわからないので処理せず、無視します。

Spring コンテキスト構成と、上記の Bean がどこから来ると予想されるかを示していただければ、私の答えはより明確になります。

于 2013-10-14T23:17:53.507 に答える