2017-02-01 2 views
0

Следуя справочным руководствам Spring Boot, я настроил пример Hello World. На моем рабочем месте используется Ant, поэтому я внедрил build.xml на основе https://www.mkyong.com/ant/ant-spring-mvc-and-war-file-example/ Результирующий WAR-файл корректно работает при развертывании на сервере WebLogic 12c. Примечание. В соответствии с этим руководством файлы .properties копируются в ${web.classes.dir}.Как запросить Oracle SQL с Spring Boot WAR?

Теперь я хочу запросить базу данных Oracle SQL Oracle через JNDI. После различных частей Spring ботинка ссылки & руководства, это мой модифицированный код в настоящее время:

@SpringBootApplication 
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { 
    @Autowired 
    private static JdbcTemplate jdbcTemplate; 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Application.class); 
    } 

    public static void main(String[] args) throws Exception { 
    SpringApplication.run(Application.class, args); 
    } 

    public static void update(String query) { 
    jdbcTemplate.update(query); 
    } 
} 

@RestController 
@RequestMapping("/query") 
public class CrudController { 

    @RequestMapping(value="/update", method=RequestMethod.GET) 
    public String update(@PathVariable String tableName, /* other params */) { 
    // Generates query from params 
    Application.update(query); 
    return query; 
    } 
} 

Я также добавил application.properties файл, который содержит одну строку, в соответствии с Весенним справочником:

spring.datasource.jndi-name=jndiName 

На данный момент WAR может развертываться на сервере, но когда я перехожу на http://ipaddr:port/appName/query/update?params, я получаю NullPointerException. Я отдельно подтвердил, что update() правильно генерирует SQL-запрос с допустимым синтаксисом, поэтому я подозреваю, что неправильно настроил конфигурацию базы данных.

Каков правильный способ подключения к базе данных JNDI и выполнения запроса?

Edit:

После обновления моего кода в соответствии с ответом Strelok, я попытался запустить обновленный файл WAR на сервере WebLogic, который впоследствии бросает следующее исключение:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'crudController': Injection of autowired dependencies failed; ... 
... 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jdbc.core.JdbcTemplate main.java.controllers.CrudController.jdbcTemplate; ... 
... 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionExcept‌​ion: No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(req‌​uired=true)} 

Я пытался модифицируя аннотацию @Autowired до @Autowired(required=true), но это ничего не изменило. Как я могу это решить?

+3

автоматического связывания не работает на 'static' полей. Также вы не должны использовать статические методы для вызова/реализации функций. –

ответ

0

Ваш JdbcTemplate является статическим и находится в вашем классе приложения, тогда как он должен принадлежать вашему контроллеру. Вот где вы должны его использовать.

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

Application.java

@SpringBootApplication 
public class Application extends SpringBootServletInitializer implements WebApplicationInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(Application.class); 
    } 

    public static void main(String[] args) throws Exception { 
    SpringApplication.run(Application.class, args); 
    } 
} 

CrudController.java

@RestController 
@RequestMapping("/query") 
public class CrudController { 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 


    @RequestMapping(value="/update", method=RequestMethod.GET) 
    public String update(@PathVariable String tableName, /* other params */) { 
    jdbcTemplate.update(query); 
    return query; 
    } 
} 
+0

Спасибо за ответ, но после его проверки я столкнулся с новой ошибкой. Проверьте обновленный раздел моего вопроса. – thegreatjedi

+0

@thegreatjedi, вероятно, вам не хватает некоторых зависимостей и/или настроек конфигурации. Запустите приложение с опцией '--debug' и обновите свой вопрос с помощью« АВТО-КОНФИГУРАЦИОННОГО ОТЧЕТА », который будет сбрасываться в журнал. Также включите ваши зависимости плюща от вашего скрипта сборки ant. – Strelok

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