Я использую Jax-RS 2.0 с Jersey 2.22.1 и Java SE 8, развернутую в Tomcat 8.0.30. У меня есть POJO с соответствующими аннотациями JAX-RS, и он работает, как и ожидалось. Я также аннотировал POJO с помощью @Singleton
. Класс лениво создается как синглтон, что является ожидаемым поведением @Singleton
. Но я хотел бы с нетерпением создавать экземпляр класса при запуске приложения. Есть ли способ сделать это? Я просмотрел аннотацию @Startup
, но, к сожалению, это часть пакета EJB, и я не использую EJB (и я не хотел бы импортировать файл jar EJB).
Я также использую 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 );
}
}
}