上下文初始化失败Spring错误NoSuchMethodException

时间:2017-03-01 15:58:34

标签: java spring hybris remember-me

当我尝试在运行时启动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配置的问题?感谢您对任何人的宝贵帮助。

1 个答案:

答案 0 :(得分: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