вторник, 14 апреля 2015 г.

Добавление зависимости из локального maven репозитория

1. Делаем mvn install в проекте, который нужно использовать в качестве зависимости
2. В  build.gradle добавляем:
    repositories {
        maven {
            url "some remote repo"
        }
mavenLocal()
    }

после чего добавляем зависимость в dependencies..
mavenLocal подключит наш локальный кэш мавена как репозиторий.

вторник, 10 февраля 2015 г.

Enum для интернализации строк

Класс:

package sample.utils.text;

import java.util.Locale;
import java.util.ResourceBundle;

public enum Message {

TERRITORIAL_BELONGING,
GLOBAL,
INTERNATIONAL,
RUSSIAN,
REGIONAL;

   
    private static final Locale ruLocale = new Locale("ru");
    private static final ResourceBundle engResources = ResourceBundle.getBundle("messages", Locale.ENGLISH);
    private static final ResourceBundle ruResources = ResourceBundle.getBundle("messages", Message.ruLocale);

     public String get(String sitename) {
        ResourceBundle bundle;
        if ("eng_site".equals(sitename)) {
            bundle = Message.engResources;
        } else {
            bundle = Message.ruResources;
        }
        return bundle.getString(this.toString());
    }

}

Использование (jsp):
<span>English: <%=Message.GLOBAL.get("eng_site")%></span>
<span>Russian: <%=Message.GLOBAL.get("russian")%></span>  

воскресенье, 8 февраля 2015 г.

Инициализация БД в Spring

Первый вариант: использование DataSourceInitializer и ResourceDatabasePopulator :

@Bean
public DataSourceInitializer dataSourceInitializer() {
    ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
    resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));

        DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
        dataSourceInitializer.setDataSource(dataSource());
        dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
        return dataSourceInitializer;
    }

Второй вариант - использовать http://flywaydb.org/

пятница, 6 февраля 2015 г.

Spring security + UTF-8

При использовании spring secutiry в связке с  spring web mvc НЕОБХОДИМО объявить фильтр CharacterEncodingFilter ДО конфигурации security - иначе ломается кодировка в запросах, русские буквы выглядят как кракозябры.

Решение в java config:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
......

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
        http.addFilterBefore(filter,CsrfFilter.class);
        
        http.authorizeRequests()
                .antMatchers("/admin/**").access("hasRole('"+UserRole.ROLE_ADMIN+"')")
                .and().formLogin().loginPage("/login").defaultSuccessUrl("/", false)
                .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
.....
}
}

При этом в web.xml фильр описывать уже не требуется.

вторник, 3 февраля 2015 г.

понедельник, 2 февраля 2015 г.

Spring data validation error: The request sent by the client was syntactically incorrect.

Для устранения ошибки в контроллере проверить, что BindingResult стоит в параметрах метода непосредственно за параметром с моделью:

ПРАВИЛЬНО:
 public String processForm(@Valid @ModelAttribute("entityObject") SampleEntity entity,BindingResult bindingResult, Model model, HttpServletRequest request )

НЕПРАВИЛЬНО:
 public String processForm(@Valid @ModelAttribute("entityObject") SampleEntity entity, Model model, HttpServletRequest requestбBindingResult bindingResult )

Spring web mvc UTF-8

Для корректной работы spring  web приложения с русскими символами (и вообще utf-8)  в web.xml добавляем фильтр:

<filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

аналог для Java Config:

в инициализаторе, расширяющем AbstractAnnotationConfigDispatcherServletInitializer переопределяем метод getServletFilters:

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);

        return new Filter[] {characterEncodingFilter};
    }

В этом же методе можно определить и другие фильтры.

пятница, 30 января 2015 г.

Java, синхронизация и видимость переменных

Не забыть - по выходу из synchronized блока jvm делает flush для значений переменных из локальных кэшей, новые значения становятся видимы всем потокам.

четверг, 15 января 2015 г.

Получить информацию о том, откуда загружен Java класс

this.getClass().getProtectionDomain().getCodeSource().getLocation()
покажет источник, откуда class loader загрузил тот или иной класс (путь и имя jar)

воскресенье, 4 января 2015 г.

Настройка jrebel + maven локально

Для отслеживания изменений на локальной машине:
1. В параметры запуска сервера добавлем опцию jvm
-javaagent:C:\jrebel\jrebel.jar
2. В pom.xml добавляем
           <plugin>
                <groupId>org.zeroturnaround</groupId>
                <artifactId>jrebel-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-rebel-xml</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Создание символьной ссылки в windows

Для создания symlink команда:
MKLINK

Пример симлинка на папку с именем с пробелом:
mklink /D google_drive "C:\Users\user1\Google Диск"