2016-04-25 4 views
1

У меня есть простой POJO, который автоволняется весной, свойства которого сохраняются.Свойства фасоли весны сохраняются

Я нахожу, что счастливый путь в порядке - задайте свойства компонента и верните его тогда, однако, когда я не нахожусь на счастливом пути, и я больше не хочу устанавливать свойство (в данном случае responseCode), я нахожу его все еще настроено на предыдущее значение (когда вызов был успешным).

Я хотел бы, чтобы это значение не было установлено и было равно тому, что я в настоящее время указал в модели.

У меня есть следующие POJO Prototype боб

package com.uk.jacob.model; 

import org.springframework.context.annotation.Scope; 
import org.springframework.stereotype.Component; 

@Component 
@Scope("prototype") 
public class Website { 
    public String url; 
    public boolean response; 
    public int responseCode = 0; 
} 

Я устанавливаю это информация в классе обслуживания

package com.uk.jacob.service; 

import java.net.HttpURLConnection; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

import com.uk.jacob.adapter.HttpAdapter; 
import com.uk.jacob.model.Website; 

@Component 
public class PingerService { 

    @Autowired 
    HttpAdapter httpAdapter; 

    @Autowired 
    Website website; 

    public Website ping(String urlToPing) { 
     website.url = urlToPing; 

     try { 
      HttpURLConnection connection = httpAdapter.createHttpURLConnection(urlToPing); 

      website.response = true; 
      website.responseCode = connection.getResponseCode(); 
     } catch (Exception e) { 
      website.response = false; 
     } 

     return website; 
    } 
} 

который называется из RestController

package com.uk.jacob.controller; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

import com.uk.jacob.model.Website; 
import com.uk.jacob.service.PingerService; 

@RestController 
@RequestMapping("api/v1/") 
public class PingController { 

    @Autowired 
    PingerService pingerService; 

    @RequestMapping(value = "ping", method = RequestMethod.GET) 
    public Website getPing(@RequestParam String url){ 
     return pingerService.ping(url); 
    } 

} 

ответ

0

Тот факт, что ваш Website bean is @Scope("prototype") означает, что каждый раз, когда th при этом он вводится как зависимость в другом компоненте при создании этого компонента, создается и вводится новый экземпляр. В этом случае PingerService получает новый экземпляр Website. Если говорят, что Website также вводится на другой компонент, который называется Website2, тогда вводится другой (новый) экземпляр.

Если ваше ожидание Website должно быть новым при каждом вызове в пределах Website, тогда это невозможно сделать просто с аннотацией прототипа. Вам нужно будет открыть контекст и вызвать ApplicationContext#getBean("website").

+0

Не могли бы вы подробнее рассказать о 'ApplicationContext # getBean (" website ")?', Что это такое? В чем проблема в моем коде? –

0

Для вашего случая использования, я понимаю, что вам нужен свежий экземпляр компонента веб-сайта для каждого запроса.

Используйте @Scope («запрос»).

Сфера действия прототипа, с другой стороны, означает, что он будет создавать отдельный экземпляр для каждого Autowiring Website, который он видит повсюду. Например, PingerService будет иметь свой собственный компонент веб-сайта и не будет использоваться для других классов с тем же Autowiring, но его значения будут сохраняться через HTTP-запросы на PingerService.

Смежные вопросы