Как ввести боб в сервис Гобелен

Я хочу внедрить бин в сервис Гобеленов (не на странице).

На данный момент я использую это:

public class EntityRealm extends AuthorizingRealm {

ApplicationContext ctx = new ClassPathXmlApplicationContext("/application-context-security.xml");
SecurityServices securityServices = (SecurityServices)ctx.getBean("securityServices");

Это работает, но я хочу использовать это:

public class EntityRealm extends AuthorizingRealm {

@Inject
private SecurityServices securityServices;

И мое applicationContext находится в web.xml. Во втором случае инъекция не работает. Зачем?

AppModule.java:

public class AppModule
{

//@Resource(name = "realm")
@Inject
private static EntityRealm realm;

@Contribute(WebSecurityManager.class)
public static void addRealms(Configuration<EntityRealm> configuration) {

    //EntityRealm realm = new EntityRealm();

    configuration.add(realm);
}

public static void contributeFactoryDefaults( MappedConfiguration<String, Object> configuration)
{
    configuration.override(SecuritySymbols.LOGIN_URL, "/login");
    configuration.override(SecuritySymbols.UNAUTHORIZED_URL, "/login");
    configuration.override(SecuritySymbols.SUCCESS_URL, "/index");
    configuration.override(SymbolConstants.APPLICATION_VERSION, "2.0-SNAPSHOT");
}

public static void contributeApplicationDefaults(MappedConfiguration<String, Object> configuration)
{
    configuration.add(SymbolConstants.HMAC_PASSPHRASE, new BigInteger(130, new SecureRandom()).toString(32));
    configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en,fr");
    configuration.add( "tapestry.default-cookie-max-age", "31536000" ); 
}

public RequestFilter buildTimingFilter(final Logger log)
{
    return new RequestFilter()
    {
        public boolean service(Request request, Response response, RequestHandler handler)
                throws IOException
        {
            long startTime = System.currentTimeMillis();
            try
            {
                return handler.service(request, response);
            } finally
            {
                long elapsed = System.currentTimeMillis() - startTime;

                log.info(String.format("Request time: %d ms", elapsed));
            }
        }
    };
}

public void contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration,
                                     @Local
                                     RequestFilter filter)
{
    configuration.add("Timing", filter);
}
}

И EntityRealm.java:

открытый класс EntityRealm расширяет AuthorizingRealm {

//***************************************
//************* Attributes  *************
//***************************************   
//ApplicationContext ctx = new ClassPathXmlApplicationContext("/application-context-security.xml");

//SecurityServices securityServices = (SecurityServices)ctx.getBean("securityServices");

//@Resource(name = "securityServices")
@Inject
private SecurityServices securityServices;

//***************************************
//************ Constructors *************
//***************************************

public EntityRealm() {
    super(new MemoryConstrainedCacheManager());
    setName("myapprealm");
    setAuthenticationTokenClass(UsernamePasswordToken.class);

} 

//***************************************
//********** Public Methods *************
//***************************************
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    if (principals == null) throw new AuthorizationException("PrincipalCollection was null, which should not happen");

application-context.xml:

<bean id="realm" class="net.atos.m2m.telecom.ihm.services.EntityRealm">
    <property name="securityServices" ref="securityServices"></property>
</bean> 

<bean id="securityServices" class="net.atos.m2m.telecom.ihm.applicatif.services.security.impl.SecurityServicesImpl">
    <property name="servicesTelSecu" ref="servicesTelSecu"></property>
    <property name="converterSecDSPtoDTO" ref="converterSecDSPtoDTO"></property>
    <property name="converterSecDTOtoDSP" ref="converterSecDTOtoDSP"></property>
</bean>

Вы можете мне помочь?

Спасибо.

2 ответа

Решение

Как я сказал в предыдущем комментарии, если вы создаете EntityRealm таким способом. New EntityRealm(), inject\autowire не работает.

Вы должны определить EntityRealm как bean .. XML или Аннотация.

<bean id="entityRealm" class="package.EntityRealm"/>
<bean id="securityServices" class="package.SecurityServices"/>

Ты можешь использовать @Resource вместо,

@Resource(name = "securityServices")
private SecurityServices securityServices;

И убедитесь, что Spring - файл загружен приложением-context-security.xml.

Другие вопросы по тегам