簡體   English   中英

上下文初始化失敗。 春季錯誤NoSuchMethodException

[英]Context initialization failed. Spring error NoSuchMethodException

當我嘗試在運行時啟動Hybris平台時,我收到此錯誤:

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配置有問題? 感謝您對任何人的寶貴幫助。

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

在這種情況下,由於要擴展現有的TokenBasedRememberMeServices類,因此需要使用相關的構造函數參數(鍵,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依賴注入的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM