понедельник, 10 июня 2019 г.

MessageSource message.properties Spring i18n интернационализация сообщений




  • @Bean("messageSource")
    public ReloadableResourceBundleMessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();    messageSource.setBasename("classpath:messages/messages"); // любой путь к файлу    messageSource.setDefaultEncoding("UTF-8");    return messageSource;}
     
    // Ключевое - ReloadableRes.... - reloadable - поддержка любого пути. 
     
  •  
    @Componentpublic class Translator {
    
        private static MessageSource messageSource;
        @Autowired    Translator(MessageSource messageSource) {
            Translator.messageSource = messageSource;    }
    
        public static String toLocale(String msgCode, Object[] args) {
            Locale locale = LocaleContextHolder.getLocale();//        Locale tmp = new Locale("ru");        return messageSource.getMessage(msgCode, args, locale);    }
    }
  •  
    Translator.toLocale("respMsg.savedOK", null)
  •  messages_ru_RU.properties: 
    respMsg.savedOK=Сохранено
  •  

воскресенье, 24 июня 2018 г.

Spring MVC @PathVariable with encoded slashes, REST c прямыми слэшами в URL в значении переменной

Use case:
@RequestMapping("/path/{variableAbleCaptureSlashes:.+}
public ResponseEntity<String> method(@PathVariable("variableAbleCaptureSlashes") var) {
    // var must accept values like "/a/b/"
             // нужно, чтобы в var  могли падать значения с прямыми слэшами

}

Решение:
  • разрешить слэши в пути
    System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
  • отключить в UrlPathHelper url-декодирование 
    @Override    public void configurePathMatch(PathMatchConfigurer configurer) {
            UrlPathHelper urlPathHelper = new UrlPathHelperNonDecoding();        urlPathHelper.setUrlDecode(false);        configurer.setUrlPathHelper(urlPathHelper);    }
  • подставить кастомную имплементацию UrlPathHelper (https://jira.spring.io/browse/SPR-11101)
  • разрешить любые символы в значении pathvariable: @RequestMapping("/path/{variableAbleCaptureSlashes:.+}


@SpringBootApplication
@EnableErrorHandlingpublic class Application extends WebMvcConfigurerAdapter {
    public static void main(String[] args) {
        System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");        SpringApplication.run(Application.class, args);    }

    @Override    public void configurePathMatch(PathMatchConfigurer configurer) {
        UrlPathHelper urlPathHelper = new UrlPathHelperNonDecoding();        urlPathHelper.setUrlDecode(false);        configurer.setUrlPathHelper(urlPathHelper);    }

    public class UrlPathHelperNonDecoding extends UrlPathHelper {

        public UrlPathHelperNonDecoding() {
            super.setUrlDecode(false);        }

        @Override        public void setUrlDecode(boolean urlDecode) {
            if (urlDecode) {
                throw new IllegalArgumentException("Handler does not support URL decoding.");            }
        }

        @Override        public String getServletPath(HttpServletRequest request) {
            String servletPath = getOriginatingServletPath(request);            return servletPath;        }


        @Override        public String getOriginatingServletPath(HttpServletRequest request) {
            String servletPath = request.getRequestURI().substring(request.getContextPath().length());            return servletPath;        }
    }
}

пятница, 8 декабря 2017 г.

Настройка NTLM и Basic аутентификации JAX-WS клиента в конфигурационном файле Spring

AllowChunking="false" в элементе http-conf:conduit/http-conf:client активизирует аутентификацию NTLM, если не указывать ее тип в http-conf:authorization . Без этой установки будет применяться аутентификация Basic.


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
        http://cxf.apache.org/transports/http/configuration
        http://cxf.apache.org/schemas/configuration/http-conf.xsd">

    <beans>

        <!-- Setting AllowChunking="false" activates NTLM authentication.
        Basic authentication will be used without it -->
        <http-conf:conduit name="*.http-conduit"
            xmlns:sec="http://cxf.apache.org/configuration/security"
            xmlns="http://cxf.apache.org/transports/http/configuration">
            <http-conf:client
                    ConnectionTimeout="1000"
                    ReceiveTimeout="10000"
                    AllowChunking="false" />
            <http-conf:authorization>
                <sec:UserName>${auth.username}</sec:UserName>
                <sec:Password>${auth.password}</sec:Password>
            </http-conf:authorization>
        </http-conf:conduit>

        <!--WS Clients-->
        <jaxws:client id="ws-client-id"
                      serviceClass="com.microsoft.schemas.sharepoint.soap.XXXX"
                      address="${endpoints.someaddress}">
        </jaxws:client>

    </beans>

</beans>

Из доков CXF:

Finally, you need to setup the CXF client to turn off chunking. The reason is that the NTLM authentication requires a 3 part handshake which breaks the streaming.

//Turn off chunking so that NTLM can occur
Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(36000);
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);

понедельник, 23 октября 2017 г.

Запуск установленной гостевой Windows 10 из хостовой Ubuntu 16.04 через Virtualbox 5

Нужен VirtualBox минимум 5.1, установка описана здесь: http://ubuntuhandbook.org/index.php/2016/07/virtualbox-5-1-released/ .
Если загрузка через EFI, в настройках VirtualBox в разделе "Система" надо поставить галочку "использовать EFI" и при создании raw-диска через createrawvmdk не забыть включить через запятую EFI-раздел с .efi файлами. И дальше как здесь.

понедельник, 3 октября 2016 г.

Return To Castle Wolfenstein 1.4 из исходников на Ubuntu 16.04 64bit

Вариант сборки из исходников на гитхабе https://github.com/hexameron/RTCW-SP-linux (ветвь https://github.com/id-Software/RTCW-SP) описан здесь.
Команду
CFLAGS="-march=i686 -O2 -pipe -fomit-frame-pointer"
для ubuntu 64bit стоит заменить на
CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer" 
Соответственно, все обращения к каталогу src/unix/release-x86-Linux/ следует заменить на src/unix/release-x86_64-Linux/. Этот каталог (release-XXXX) будет единственным созданным внутри src/unix/, поэтому его имя будет очевидным.

При ошибках вида "не найдено SDL/SDL.h" нужно установить libsdl1.2-dev.

Сборка может дать исполняемый файл игры, в котором возникает stack smashing error при запуске.
В этом случае надо отредактировать в исходниках файл src/renderer/tr_image.c: в строке 316 следует заменить
unsigned p1[1024], p2[1024];
на
unsigned p1[2048], p2[2048];
Затем проделать повторную сборку (удалить каталог unix/release-x86_64-Linux/, вызвать make и переписать получившиеся исполняемый .exe и библиотечные файлы .so в целевой каталог с игрой, как в мануале).


четверг, 21 июля 2016 г.

Запуск установленной (гостевой) Windows 7 в VirtualBox из хостовой Ubuntu 16.04.

Предварительно, пользователь должен быть в группе disk и vboxusers ( sudo usermod -a -G disk $USER && sudo usermod -a -G vboxusers $USER). Для корректной работы grub-mkrescue нужно установить xorriso (sudo apt-get install xorriso).
По третьему способу отсюда:

Создаем директорию:

$ mkdir -p ~/.iso/boot/grub

В этой директории любым способом создал файл grub.cfg следующего содержания:
(Раздел menuentry «Windows 7» скопировать со своего grub.cfg, расположенного по адресу /boot/grub/)

insmod part_msdos
set default=0
set timeout=0
menuentry "Windows 7 (loader) (on /dev/sda3)" --class windows --class os {
insmod part_msdos
insmod ntfs
set root='(/dev/sda,msdos3)'
search --no-floppy --fs-uuid --set=root C070671099FC2625
chainloader +1
}


Здесь убрано все лишнее, GRUB проскакивает быстро и незаметно.

Создаем iso-образ с GRUB2:

$ grub-mkrescue --output=/home/$USER/.iso/grub.iso /home/$USER/.iso/

Создаем VMDK-образ:

$ VBoxManage internalcommands createrawvmdk -filename /home/$USER/VirtualBox/Windows7.vmdk -rawdisk /dev/sda -partitions 3,5 -relative

Далее создаем и настраиваем виртуальную машину так же как и во втором способе.
Так же выбираем grub.iso.
Едиственный нюанс: при автоматической установке дополнений гостевой оси, образ этого iso заменится на VBoxGuestAdditions.iso. Поменяйте его обратно.

Еще раз повторюсь, в примерах используются мои настройки. Вносите изменения.