2017-03-01 72 views
0

當我嘗試在運行時推出款Hybris平臺我得到這個錯誤:上下文初始化失敗。春天錯誤NoSuchMethodException

WARN [localhost-startStop-1] [TenantIgnoreXmlWebApplicationContext] Exception encountered during context initialization - cancelling refresh at 
tempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'checkoutController': Injection of resource depend 
encies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'autoLoginStrategy' de 
fined in ServletContext resource [/WEB-INF/config/common-spring-security-config.xml]: Cannot resolve reference to bean 'rememberMeServices' whil 
e setting bean property 'rememberMeServices'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean w 
ith name 'defaultRememberMeServices' defined in ServletContext resource [/WEB-INF/config/common-spring-security-config.xml]: Instantiation of be 
an failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.sap.hybris.fs.storefront.securit 
y.AcceleratorRememberMeServices]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.sap.hybris.fs.storefron 
t.security.AcceleratorRememberMeServices.<init>() 

的AcceleratorRememberMeServices類是這樣的:

/* 
* [y] hybris Platform 
* 
* Copyright (c) 2000-2015 hybris AG 
* All rights reserved. 
* 
* This software is the confidential and proprietary information of hybris 
* ("Confidential Information"). You shall not disclose such Confidential 
* Information and shall use it only in accordance with the terms of the 
* license agreement you entered into with hybris. 
* 
* 
*/ 
package com.sap.hybris.fs.storefront.security; 

import de.hybris.platform.acceleratorservices.urlencoder.UrlEncoderService; 
import de.hybris.platform.acceleratorstorefrontcommons.constants.WebConstants; 
import de.hybris.platform.commercefacades.customer.CustomerFacade; 
import de.hybris.platform.commercefacades.storesession.StoreSessionFacade; 
import de.hybris.platform.commerceservices.security.SecureTokenService; 
import de.hybris.platform.commerceservices.strategies.CheckoutCustomerStrategy; 
import de.hybris.platform.servicelayer.i18n.CommonI18NService; 
import de.hybris.platform.servicelayer.user.UserService; 
import com.sap.hybris.fs.storefront.web.wrappers.RemoveEncodingHttpServletRequestWrapper; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.lang.StringUtils; 
import org.springframework.beans.factory.annotation.Required; 
import org.springframework.security.authentication.RememberMeAuthenticationToken; 
import org.springframework.security.core.Authentication; 
import org.springframework.security.core.userdetails.UserDetails; 
import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices; 


public class AcceleratorRememberMeServices extends TokenBasedRememberMeServices 
{ 
    public AcceleratorRememberMeServices(String key, UserDetailsService userDetailsService) { 
     super(key, userDetailsService); 
     // YTODO Auto-generated constructor stub 
    } 

    private UserService userService; 
    private CustomerFacade customerFacade; 
    private CheckoutCustomerStrategy checkoutCustomerStrategy; 
    private StoreSessionFacade storeSessionFacade; 
    private CommonI18NService commonI18NService; 
    private UrlEncoderService urlEncoderService; 
    private SecureTokenService secureTokenService; 

    @Override 
    protected void setCookie(final String[] tokens, final int maxAge, final HttpServletRequest request, 
          final HttpServletResponse response) 
    { 
     if (!getCheckoutCustomerStrategy().isAnonymousCheckout()) 
     { 
      super.setCookie(tokens, maxAge, new RemoveEncodingHttpServletRequestWrapper(request, getUrlEncodingPattern(request)), 
        response); 
     } 
    } 

    @Override 
    public void logout(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) 
    { 
     super.logout(new RemoveEncodingHttpServletRequestWrapper(request, getUrlEncodingPattern(request)), response, authentication); 
    } 

    @Override 
    protected Authentication createSuccessfulAuthentication(final HttpServletRequest request, final UserDetails user) 
    { 
     getUserService().setCurrentUser(getUserService().getUserForUID(user.getUsername())); 

     if (StringUtils.isNotEmpty(getUrlEncoderService().getUrlEncodingPattern())) 
     { 
      getCustomerFacade().rememberMeLoginSuccessWithUrlEncoding(getUrlEncoderService().isLanguageEncodingEnabled(), 
        getUrlEncoderService().isCurrencyEncodingEnabled()); 
     } 
     else 
     { 
      getCustomerFacade().loginSuccess(); 
     } 
     final RememberMeAuthenticationToken auth = new RememberMeAuthenticationToken(getKey(), user, user.getAuthorities()); 
     auth.setDetails(getAuthenticationDetailsSource().buildDetails(request)); 
     return auth; 
    } 

    @Override 
    protected String retrievePassword(final Authentication authentication) 
    { 
     return getUserService().getUserForUID(authentication.getPrincipal().toString()).getEncodedPassword(); 
    } 

    protected String getUrlEncodingPattern(final HttpServletRequest request) 
    { 
     final String encodingAttributes = (String) request.getAttribute(WebConstants.URL_ENCODING_ATTRIBUTES); 
     return StringUtils.defaultString(encodingAttributes); 
    } 

    protected UserService getUserService() 
    { 
     return userService; 
    } 

    @Required 
    public void setUserService(final UserService userService) 
    { 
     this.userService = userService; 
    } 

    protected CustomerFacade getCustomerFacade() 
    { 
     return customerFacade; 
    } 

    @Required 
    public void setCustomerFacade(final CustomerFacade customerFacade) 
    { 
     this.customerFacade = customerFacade; 
    } 

    protected CheckoutCustomerStrategy getCheckoutCustomerStrategy() 
    { 
     return checkoutCustomerStrategy; 
    } 

    @Required 
    public void setCheckoutCustomerStrategy(final CheckoutCustomerStrategy checkoutCustomerStrategy) 
    { 
     this.checkoutCustomerStrategy = checkoutCustomerStrategy; 
    } 

    protected UrlEncoderService getUrlEncoderService() 
    { 
     return urlEncoderService; 
    } 

    @Required 
    public void setUrlEncoderService(final UrlEncoderService urlEncoderService) 
    { 
     this.urlEncoderService = urlEncoderService; 
    } 


    protected StoreSessionFacade getStoreSessionFacade() 
    { 
     return storeSessionFacade; 
    } 

    @Required 
    public void setStoreSessionFacade(final StoreSessionFacade storeSessionFacade) 
    { 
     this.storeSessionFacade = storeSessionFacade; 
    } 

    protected CommonI18NService getCommonI18NService() 
    { 
     return commonI18NService; 
    } 

    @Required 
    public void setCommonI18NService(final CommonI18NService commonI18NService) 
    { 
     this.commonI18NService = commonI18NService; 
    } 

    protected SecureTokenService getSecureTokenService() 
    { 
     return secureTokenService; 
    } 

    @Required 
    public void setSecureTokenService(final SecureTokenService secureTokenService) 
    { 
     this.secureTokenService = secureTokenService; 
    } 
} 

這個bean以這種方式宣告:

<alias name="defaultRememberMeServices" alias="rememberMeServices"/> 
    <bean id="defaultRememberMeServices" class="com.sap.hybris.fs.storefront.security.AcceleratorRememberMeServices" > 
     <property name="userDetailsService" ref="originalUidUserDetailsService" /> 
     <property name="key" value="fsstorefront" /> 
     <property name="cookieName" value="fsstorefrontRememberMe" /> 
     <property name="alwaysRemember" value="true" /> 
     <property name="userService" ref="userService"/> 
     <property name="useSecureCookie" value="false"/> 
     <property name="customerFacade" ref="customerFacade"/> 
     <property name="checkoutCustomerStrategy" ref="checkoutCustomerStrategy"/> 
     <property name="urlEncoderService" ref="urlEncoderService"/> 
     <property name="storeSessionFacade" ref="storeSessionFacade"/> 
     <property name="commonI18NService" ref="commonI18NService"/> 
     <property name="secureTokenService" ref="secureTokenService"/> 
    </bean> 

構造函數方法有問題嗎?或者是Spring配置的問題?感謝您爲任何人提供寶貴的幫助。

+0

你是如何聲明豆? – rmlan

+0

@rmlan我添加了bean聲明 – sharkbait

回答

1

它正在尋找默認的構造函數,因此<init>()。您需要創建默認構造函數,或者在聲明bean時使用構造函數參數。

在這種情況下,由於您正在擴展現有的TokenBasedRememberMeServices類,因此您需要用相關的構造函數參數(key,userDefaultsService)聲明bean,而不是將它們注入爲屬性。你應該聲明看起來是這樣的:

<bean id="defaultRememberMeServices" class="com.sap.hybris.fs.storefront.security.AcceleratorRememberMeServices" > 
    <!-- constructor arguments --> 
    <constructor-arg index="0" value="fsstorefront"/> 
    <constructor-arg index="1" ref="originalUidUserDetailsService" /> 

    <!-- rest of the properties --> 
    <property name="cookieName" value="fsstorefrontRememberMe" /> 
    <property name="alwaysRemember" value="true" /> 
    <property name="userService" ref="userService"/> 
    <property name="useSecureCookie" value="false"/> 
    <property name="customerFacade" ref="customerFacade"/> 
    <property name="checkoutCustomerStrategy" ref="checkoutCustomerStrategy"/> 
    <property name="urlEncoderService" ref="urlEncoderService"/> 
    <property name="storeSessionFacade" ref="storeSessionFacade"/> 
    <property name="commonI18NService" ref="commonI18NService"/> 
    <property name="secureTokenService" ref="secureTokenService"/> 
</bean> 

查看更多有關構造參數注入和Spring依賴注入在一般here

+0

但這 '公共AcceleratorRememberMeServices(String鍵,UserDetailsS​​ervice中的UserDetailsS​​ervice){ 超(鍵,UserDetailsS​​ervice的); }' 還不夠? – sharkbait

+0

這不是默認的(無參數)構造函數。在構造bean時,Spring如何知道爲什麼要注入「key」和「userDetailsS​​ervice」? – rmlan

+0

好吧,我必須以什麼方式創建構造函數? – sharkbait

相關問題