2016-05-19 4 views
0

У меня есть некоторые проблемы с поиском, как заставить JAX-RS 2.0 работать с CDI на wildfly 10. Я получил ответ на другой post, который был сочетание JAX-RS 1.0/2.0, и они использовали другие зависимости, чем включенные библиотеки в Wildfly.Как использовать @Inject и CDI для корпоративных бобов с JAX-RS 2.0 (Resteasy)

Моя цель - внедрить единый корпоративный компонент, который инкапсулирует бизнес-логику, которая находится в той же банке в моем ресурсе REST. Класс ресурсов REST должен быть областью действия запроса и иметь дело только с функциональностью REST (запрос и ответ). Мои классы POJO обозначаются JAXB.

Как использовать JAX-RS 2.0 с включенными библиотеками CDI в Wildfly 10?

Компонент интерфейса

@Local 
public interface DateBean { 
    Date getLocalFormatDate(); 
} 

Компонент

@Singleton 
public class DateBeanImpl implements DateBeanLocal { 

    private static final Logger LOG = Logger.getLogger("org.test.logger"); 

    public DateBean() { 
     LOG.fine("DateBean"); 
    } 

    @Override 
    public Date getLocalFormatDate() { 
     Calendar cal = Calendar.getInstance(); 
     TimeZone localZone = TimeZone.getDefault(); 
     cal.setTimeZone(localZone); 
     Date localTime = cal.getTime(); 
     return localTime; 
    } 
} 

остальной ресурс

@Path("classroom") 
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public class ClassRoomResource { 

    private static final Logger LOG = Logger.getLogger("org.clearbyte.logger"); 
    @Inject private DateBean dateBean; 

    public ClassRoomResource() { 
     LOG.fine("ClassRoomResource"); 
    } 

    @GET 
    @Path("{id}/getDummy") 
    public ClassRoom getDummy(@PathParam("id") long id) { 
     ClassRoom room = new ClassRoom(); 
     room.setRoomName("Dummy"); 
     room.setRoomNr(id); 
     return room; 
    } 

    @GET 
    @Path("localDate") 
    @Produces({MediaType.TEXT_HTML}) 
    public Response getLocalformatDate() { 
     LOG.fine("DateBean variable: " +dateBean); 
     Date localDate = dateBean.getLocalDate(); 
     LOG.fine("Local date: " +localDate); 
     return Response.status(Response.Status.OK) 
       .entity(localDate.toString()) 
       .build(); 
    }   
} 
+0

Я не понимаю этого вопроса. JAX-RS поддерживает CDI из коробки. –

+0

Я тоже не понимаю. Чтобы включить ресурс JAX-RS в контейнере Java EE 7, вам нужно использовать только аннотации JAX-RS (в зависимости от спецификации Java EE для образца в ваших зависимостях maven), а затем для инжекции всего, что вы хотите ввести (сеансовые компоненты, управляемые бобы, ...) с использованием CDI. Не нужно также зависеть от Resteasy libs (кроме тех случаев, когда вы используете специальные функции Resteasy) –

+0

Правда, не нужно добавлять зависимости для JAX-RS 2.0. Отредактировал ответ. – Chris

ответ

0

Реализация Resteasy из JAX-RS 2.0 включены в Wildlfy 10, так что есть нет необходимости добавлять дополнительные зависимости.

Интерфейс не нужен @Local, когда он находится в той же банке/войне для CDI, чтобы ее найти. Чтобы сделать единичный компонент предприятия в CDI, используйте @ApplicationScope, вы можете опустить ноту @Singleton, если вам не нужен управляемый компонент с синхронизацией чтения/записи.

@ApplicationScoped 
public class DateBeanImpl implements DateBean { 

    private static final Logger LOG = Logger.getLogger("org.test.logger"); 

    public DateBean() { 
     LOG.fine("DateBean"); 
    } 

    @Override 
    public Date getLocalFormatDate() { 
     //DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Calendar cal = Calendar.getInstance(); 
     TimeZone localZone = TimeZone.getDefault(); 
     cal.setTimeZone(localZone); 
     Date localTime = cal.getTime(); 
     return localTime; 
    } 
} 

Сделать запрос ресурсов ресурса REST использующим нотацию @RequestScoped. Обратите внимание, что @Inject вводит интерфейс, а не реализацию компонента.

@RequestScoped 
@Path("classroom") 
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN}) 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public class ClassRoomResource { 

    private static final Logger LOG = Logger.getLogger("org.clearbyte.logger"); 
    @Inject private DateBean dateBean; 
    ... 

Нет Конфигурация web.xml необходима, если Вы расширить JAX-RS класса Application.

@ApplicationPath("rest") 
public class ClassRoomApp extends Application { 

private final Set<Class<?>> resources = new HashSet<>(); 

    public ClassRoomApp() { 
     resources.add(ClassRoomResource.class); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return resources; 
    } 
} 
Смежные вопросы