Java-Джерси RESTful-сервисы - PullRequest
3 голосов
/ 10 мая 2010

Скорее, новичок в REST и Джерси, и я пробую некоторые базовые примеры. У меня есть один конкретный вопрос, на который я пока не нашел ответа (не знаю, как его искать): как бы вы занялись хранением / определением общих служб что они с состоянием и доступны для всех / некоторых ресурсов?

Например, экземпляр регистратора (Log4J или любой другой). Должен ли я вручную инициализировать это и сохранить его в HttpSession? Есть ли лучший способ сделать это так, чтобы мой регистратор был доступен для всех / некоторых ресурсов?

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

Ваш лучший вариант - внедрить сервисы в Ресурс, используя что-то вроде Spring. Добавление сеттера в ваш ресурс для конкретной службы делает ее доступной для различных областей. В следующем руководстве подробно объясняется, как использовать Spring и Jersey. Ниже приведены примеры различных частей, необходимых для этой работы. В частности, отвечая на ваш вопрос, однако, «лучшая практика» - позволить Spring управлять «состоянием» или «областью действия» конкретной службы.

Простой компонент службы

public class SimpleBean {
    private int counter;
    public String sayHello() {  
        return Integer.toString(counter++);
    }  
}

Простой ресурс JAX-RS

public class HelloWorldResource {

    private SimpleBean simpleBean;

    public void setSimpleBean(SimpleBean simpleBean) {
        this.simpleBean = simpleBean;
    }

    @GET @Path("/Hello") @Produces(MediaType.APPLICATION_JSON)
    public String sayHello() {
        return "{\"Hello\": \"" + this.simpleBean.sayHello() + "\"}";
    }
}

Простой Spring applicationContext.xml, обратите внимание на «область действия» для Бина и Ресурса. Это определяет состояние этих объектов.

<bean id="simpleBean" scope="prototype" class="myhealth.spring.SimpleBean"/>

<bean id="helloWorldResource" scope="singleton" class="myhealth.ajax.HelloWorldResource">
    <property name="simpleBean">
        <ref bean="simpleBean"/>
    </property>
</bean>
2 голосов
/ 19 мая 2010

Говоря строго о Logger, вы уверены, что хотите, чтобы он был с состоянием? Большинство проектов, в которых я участвовал, просто берут один в любом классе, где это нужно

Logger log = Logger.getLogger(this.getClass().getName());

Вырезай и вставляй это везде и начинай магию лесозаготовок!

К исходному вопросу о сохранении состояния: хотите ли вы сохранить что-то с состоянием для каждого пользователя (например, сеанс) или какое-то другое состояние в приложении (например, настроенный во время выполнения регистратор)? Сеансами можно управлять с помощью HttpRequest и некоторых ServletFilters. Захватите запрос в своем коде JErsey следующим образом

@Path("/awesome")
public class AwesomeService {

    @GET
    @Produces("text/awesome")
    public String getAwesome(@Context HttpServletRequest req) {   
        HttpSession session= req.getSession(true);
        //brilliance
    }
}

Ресурсы приложения, такие как менеджер сущностей или konfabulator, могут быть инициализированы статически и использоваться как синглтоны или с фабриками.

class EntityManager { 
EntityManager manager;
public static EntityManager getManager() {
        if(manager == null) {
            manager = initManager();
        }
        return manager;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...