Как сделать аннотированный одноэлементный класс JAX-RS УДОБНО созданным

Я использую 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 );
        }
    }

}

person Alan S.    schedule 18.02.2016    source источник


Ответы (1)


См. Руководство пользователя Jersey 2.22.1:

Если вы хотите использовать поддержку DI Jersey Spring, вам нужно будет добавить модуль jersey-spring3 в список ваших зависимостей:

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

Кажется, это работает и для Spring 4. См. вопрос 21443088.

person dur    schedule 18.02.2016
comment
Кстати... следующий пост поможет устранить любые исключения контекста Spring, которые возникают при использовании jersey-spring3 без файла конфигурации Spring (100% управляемый аннотацией)... java.net/jira/browse/ДЖЕРСИ-2038 - person Alan S.; 19.02.2016