如何使JAX-RS带注释的单例类EAGERLY实例化

时间:2016-02-18 21:57:30

标签: java singleton jax-rs instantiation eager

我正在使用Jax-RS 2.0与Jersey 2.22.1和Java SE 8,部署在Tomcat 8.0.30中。 我用适当的JAX-RS注释注释POJO,并按预期工作。我还用@Singleton注释了POJO。该类被懒惰地实例化为单例,这是@Singleton的预期行为。但我想在应用程序启动时热切地实例化该类。有没有办法做到这一点?我查看了@Startup注释,但不幸的是,这是EJB包的一部分,我没有使用EJB(我也不想导入EJB jar文件)。

我也在使用Springframework 4.2.4,默认情况下,在使用@Service@Component注释时会急切地实例化单例,但不幸的是,我不能在JAX-RS POJO上使用这些注释(这这就是为什么课程从SpringBeanAutowiringSupport延伸。

我附加了java代码,但由于它按预期工作,我不确定会添加任何有用的东西。

import javax.inject.Singleton;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.core.MediaType;
import org.xxx.profile.util.GeneralUtil;
import org.xxx.profile.util.WebServiceLogger;
import org.xxx.profile.util.datatransfer.AccountDTO;
import org.xxx.profile.web.exception.RestException;
import org.xxx.profile.web.exception.FailureResponse;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;


@Singleton
@Path( "account" )
public class AccountWebService  extends SpringBeanAutowiringSupport{


    @Autowired
    private AccountLogic accountLogic;

    @Autowired
    protected SimpleParser simplerParser;


    @GET
    @Path("get/{id: [a-zA-Z][a-zA-Z_0-9]*}")
    @Produces( MediaType.APPLICATION_JSON )
    @Consumes( MediaType.APPLICATION_JSON )
    public AccountDTO retrieveAccount(@PathParam("id") String customerId) throws RestException {
        try {
            return accountLogic.retrieveAccount(customerId);
        }
        catch(Exception e){
            String transactionID = GeneralUtil.getUniqueID();
            WebServiceLogger.severe( transactionID, "Unable to retrieve an account for the customerId: " + customerId, e, this.getClass() );
            throw new RestException( new FailureResponse( FailureResponse.Status.FAIL, "add user friendly message here", transactionID ), e );
        }
    }

}

1 个答案:

答案 0 :(得分:0)

请参阅Jersey 2.22.1 User Guide

  

如果您想使用Jersey Spring DI支持,您需要将jersey-spring3模块添加到依赖项列表中:

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>2.22.1</version>
</dependency>

它似乎也适用于Spring 4。见Question 21443088