2015-10-07 3 views
3

У меня есть класс, как показано ниже:автоматического связывания проблема с SpringBoot

package com.company.data.render.model 
@RestController 
public class ControllerClass { 

@Autowired 
ApplicationPropertiesServiceImpl services; 

@RequestMapping(value = "/node1", method = RequestMethod.GET) 
@ResponseBody 
public ParentNode getNode1() 
{ 


    Child node = new Child(); 
    List<Map<String, Object>> properties properties = services.getData("A",xxx); 
    node.addtree(); 
    node.setProperties(properties); 
    return node; 
} 
} ------------------------------------------------------------------------------- 

package com.company.data.service; 
@Component 
public List<Map<String, Object>> getData(String type,String name) 
{ 
     if(type.equalsIgnoreCase("A")) 
     { 
      String sql = "select * from data.data_properties(?)"; 
      List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql,host); 
      return rows; 
     }else if(properties.equalsIgnoreCase("B")) 
     { 
      String sql = "select * from data.application_properties(?)"; 
      List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql,host); 
      return rows; 
     } 

} 

------------------------------------------------------------------------------- 
package com.company.data.render.model; 

@Component 
public class Child { 

@Autowired 
ApplicationPropertiesServiceImpl services; 


public void addtree() 
{ 
List<Map<String, Object>> properties=services.getData("B", "xxy"); 

} 
} 

Как я могу получить доступ к GetData() функция в ребенка class.I подводят исключение нулевого указателя для службы объекта, хотя Я autowired в ApplicationPropertiesServiceImpl

+1

опечатка аннотацию он должен быть '@ Autowired'. Однако это плохая идея подключить контроллер к другому компоненту. Было бы лучше, если бы вы извлекли общий код в отдельный компонент '@ Service' и ссылку на этот компонент из контроллера и вашего класса' Child'. Конечно, вы также должны правильно настроить контекст приложения и инициализировать его. – hotzst

+0

Лучше вы отделите логику, текущий ваш контроллер делает слишком много вещей. Я предлагаю вам сделать 2 класса: службу и DAO (репозиторий). Репозиторий даст вам результат db. И сервис будет иметь объект DAO + некоторый бизнес. Оба контроллера будут обслуживаться автоматически. – korogui

+0

@korogue --evenif я создаю отдельный класс. Как я получу один и тот же объект службы в обоих классах? – Aman

ответ

0

Похоже, вы будете иметь 2 контроллера.

Очевидно, что ваш контроллер делает слишком много. И не рекомендуется вводить контроллер в другой контроллер.

Я предлагаю вам сделать службу и Repository:

Модель получает на много данных от контроллера, так что я предлагаю создать класс, чтобы сделать его более понятным, потому что возвращать карту слишком абстрактна и сделать код трудным для чтения.

public class CarProperties { 
    private Integer id; 
    private String name; 
    private Integer age; 
    private String color; 
    //setters and gettters 
    .... 
} 

Услуги:

public interface CarPropertiesService { 
    public List<CarProperties> findAll(String type); 
} 

@Service("CarPropertiesService") 
public class CarPropertiesServiceImpl implements CarPropertiesService { 
    @Autowired 
    private CarPropertiesDAO carPropertiesDAO; 

    public List<CarProperties> findAll(String type) { 
     List<CarProperties> result = new ArrayList<>(); 
     if ("XXX".equalsIgnoreCase(type)) { 
     List<Map<String, Object>> carPropertiesList = carPropertiesDAO.findAll(); 
     for(Map<String, Object> carProperties : carPropertiesList) { 
      result.add(getCarPropertiesInstance(carProperties)); 
     } 

     } 
     return result; 
    } 

    private CarProperties getCarPropertiesInstance(Map<String, Object> properties) { 
     CarProperties instance = new CarProperties(); 
     instance.setId(properties.get("id")); 
     instance.setName(properties.get("name")); 
     ... 
     return instance; 
    } 
} 

DAO:

public interface CarPropertiesDAO { 
    public List<Map<String, Object>> findAll(); 
} 

@Repository("CarPropertiesDAO") 
public class CarPropertiesDAOImpl implements CarPropertiesDAO { 
    ... 
    public List<Map<String, Object>> findAll() { 
     String sql = "select * from data.car_properties(?)"; 
     return jdbcTemplate.queryForList(sql,host); 
    } 
} 

и, наконец, ваши контроллеры сделает использование сервиса:

@RestController 
public class ControllerClass { 
    @Autowired 
    private CarPropertiesService carPropertiesService; 

    @RequestMapping(value = "/node1", method = RequestMethod.GET) 
    @ResponseBody 
    public ParentNode getNode1() 
    { 
     List<CarProperties> properties = carPropertiesService.findAllByType("XXX"); 
     return properties; 

    } 

    @RequestMapping(value = "/prop/{type}/{name}", method = RequestMethod.GET) 
    @ResponseBody 
    public List<CarProperties> getData(@PathVariable String type,@PathVariable String name) 
    { 
     List<CarProperties> rows = carPropertiesService.findAllByType(type);  
     ... 
    } 
} 

@Controller 
public class Controller2 { 
    @Autowired 
    CarPropertiesService carPropertiesService; 


    public void addtree(){ 
     List<CarProperties> rows = carPropertiesService.findAllByType("XXX"); 
    } 
} 

RESUMING: контроллеры не должны беспокоиться о бизнес, бу t только возвращает данные. Служба должна быть там, где бизнес, например, вычисления, обмен данными и т. Д. Класс DAO, который вы можете ясно видеть, используется для действий DB. Также имейте в виду, что доступ к объектам DAO должен быть в Services/Facedes, используя его в рекомендуемом контроллере. Таким образом, используя эту структуру, ваш код станет более многоразовым и простым в обслуживании.

+0

Но что необходимо из двух классов dao и impl ... не путайте littilbit – Aman

+0

Не совсем, один интерфейс, а другой класс. Вы можете повторно использовать интерфейс для разных классов. – korogui

+0

Это решение не будет вписываться в мою проблему. Любезное спасибо Becoz, это не таблица, которую я запрашиваю. Это функция, которую я выполняю по запросу. – Aman

0

Pls попробовать это: -

@Component 
@ComponentScan(basePackages="<provide your base pkg where it will scan for the component ControllerClass>") 
@ConditionalOnBean(ControllerClass.class) 
public class Child { 
    @Autowired(required=true) 
    private ControllerClass controllerClass; 

    public void addtree(){ 
    controllerClass.getData("XXX",xxx) 
    } 
} 
+0

Нет. .Это не работает ... – Aman

+0

Просьба проверить мое обновленное предложение выше, чтобы включить аннотацию @ComponentScan. – Avis

+0

Нет ..ий номер – Aman

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