12 Mayıs 2019 Pazar

SpringBoot Jackson2ObjectMapperBuilder Sınıfı

Giriş
Jackson ayarlarını özelleştirmek için 3 tane yöntem ver
1. application.properties ile özeleştirmek
2. Jackson2ObjectMapperBuilderCustomizer  ile özeleştirmek
3. Jackson2ObjectMapperBuilder ile özeleştirmek
4. ObjectMapper nesnesi direkt yaratılır ve özelleştirilir


Yöntem 2
Bu sınıfı kullanmak için SpringMVC projesinde şöyle yaparız.
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {

 ... other configurations

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    ...
    converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    converters.add(new MappingJackson2XmlHttpMessageConverter(builder
      .createXmlMapper(true).build()));
  }
}
Yöntem 3
SpringBoot projesinde şöyle yaparız.
@SpringBootApplication
public class Application extends SpringBootServletInitializer {

  @Bean
  public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    ObjectMapper objectMapper = builder.createXmlMapper(false).build();
    ...
    return objectMapper;
  }
}
constructor
Şöyle yaparız.
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
configure metodu
Şöyle yaparız
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
  ObjectMapper objectMapper = builder.createXmlMapper(false).build();
  objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
  return objectMapper;
}
dateFormat metodu
Şöyle yaparız.
builder.dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
indentOutput metodu
Şöyle yaparız.
builder.indentOutput(true);
modulesToInstall metodu
Şöyle yaparız.
@Bean
public Jackson2ObjectMapperBuilder configureObjectMapper() {
  return new Jackson2ObjectMapperBuilder()
    .modulesToInstall(Hibernate5Module.class);
}
propertyNamingStrategy
Örnek
Şöyle yaparız.
builder.propertyNamingStrategy
  (PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
Örnek
Şöyle yaparız
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
  Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
  b.propertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
  return b;
}
serializationInclusion metodu
Örnek
Şöyle yaparız
@Bean
public Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder() {
  return new Jackson2ObjectMapperBuilder()
     .serializationInclusion(JsonInclude.Include.NON_NULL);
}
Örnek
Şöyle yaparız.
builder.serializationInclusion(Include.NON_EMPTY);
Örnek
Şöyle yaparız.
builder.serializationInclusion(JsonInclude.Include.NON_NULL);

10 Mayıs 2019 Cuma

SpringSession @EnableRedisHttpSession Anotasyonu

Giriş
Şu satırı dahil ederiz.
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
Hazelcast kullanmak istersk @EnableHazelcastHttpSession anotasyonunu kullanırız.
Örnek
Şöyle yaparız.
@Configuration
@EnableRedisHttpSession
public class RedisSessionConfig {
  @Bean
  public RedisTemplate<Object, Object> sessionRedisTemplate(
            RedisConnectionFactory connectionFactory) {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setKeySerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
    template.setConnectionFactory(connectionFactory);
    return template;
  }
}
Ayarlar için şöyle yaparız.
spring.session.store-type=redis
# redis database
spring.redis.database=8
# redis host
spring.redis.host=102.128.2.65
# redis password
#spring.redis.password=
#redis port
spring.redis.port=6379

9 Mayıs 2019 Perşembe

SpringSecurity CorsConfiguration Sınıfı - HttpSecurity İle Kullanılır

Kullanım
Örnek
Bir projede şöyle yaptım
@Bean
public CorsConfigurationSource corsConfigurationSource()[
  UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

  CorsConfiguration cors = new CorsConfiguration();
  cors.applyPermitDefaultsValues();
  cors.setAllowCredentials(true);

  //Required to send back a custom header in response
  cors.addExposedHeader("role");
  
  //Default methods are GET,HEAD,POST
  //Add other required methods
  cors.addAllowedMethod("DELETE");
  cors.addAllowedMethod("PATH");
  cors.addAllowedMethod("PUT");

  source.registerCorsConfiguration("/*",cors);
  return source;
}
Örnek
Şöyle yaparız.
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
     http
      // by default uses a Bean by the name of corsConfigurationSource
      .cors().and()
      ...
  }

  @Bean
  CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
  }
}
constructor
Şöyle yaparız.
CorsConfiguration configuration = new CorsConfiguration();
addAllowedMethod metodu
applyPermitDefaultValues() çağrısı ile gelen varsayılan metodlar GET,HEAD ve POST. Eklenebilecek metodlar şöyle.
DELETE
PUT
OPTIONS
addAllowedOrigin metodu
Açıklaması şöyle. Spring'in hangi origin'den gelen request'leri kabul edip etmeyeceğini belirtir.
applyPermitDefaultValues() çağrısı ile gelen varsayılan origin "*" değeridir. Bu değer ile
her origin kabul edilir.
In the AllowedOrigin element, you specify the origins that you want to allow cross-domain requests from, for example, http://www.example.com. The origin string can contain only one * wildcard character, such as http://*.example.com. You can optionally specify * as the origin to enable all the origins to send cross-origin requests. You can also specify https to enable only secure origins.
addExposedHeader metodu
Açıklaması şöyle. Spring'in response içinde header gönderebilmesini sağlar.
ExposeHeader—Identifies the response headers that customers are able to access from their applications (for example, from a JavaScript XMLHttpRequest object).
applyPermitDefaultValues metodu
allowedOrigins, allowedMethods,,resolveMethods,maxAge alanlarına varsayılan değerler atar.

setAllowCredentials metodu
Açıklaması şöyle. Spring'in cookie'leri kabul edip kullanabilmesini sağlar. applyPermitDefaultValues() çağrısı ile bu değer false gelir. Session ve cookie kullanmak için true atamak gerekir.
Credentials include cookies and HTTP authentication schemes.

8 Mayıs 2019 Çarşamba

SpringAsync AsyncConfigurerSupport Sınıfı

Giriş
Global olarak kullanılan Executor nesnesini yaratır. Açıklaması şöyle.
this now becomes the default executor to run methods annotated with @Async
Açıklaması şöyle. Yani bu sınıf yerine AsyncConfigurer arayüzünden de kalıtılabilir.
AsyncConfigurer is an Interface provided by Spring, It provides two methods One is if you want to override the TaskExecutor(Threadpool), another is an Exception handler where you can inject your exception handler so it can catch the uncaught exceptions. You can create your own class and implement that one directly. but I will not do that, as an alternative, I will use Spring  AsyncConfigurerSupport class which is annotated by @Configuration and @EnableAsync, and provides a default implementation.
getAsyncExecutor metodu
ThreadPoolTaskExecutor nesnesi döndürür

getAsyncUncaughtExceptionHandler metodu
@Async olarak işaretli metodlardan fırlatılan exception'ları işleyen AsyncUncaughtExceptionHandler  arayüzündne kalıtan nesneyi döndürür.

Örnek
Şöyle yaparız. Burada @Configuration kullanılmış ama bence gerek yok
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
public class AsynConfiguration extends AsyncConfigurerSupport {
   @Override
   public Executor getAsyncExecutor() {
      ThreadPoolTaskExecutor executor = new 
                ThreadPoolTaskExecutor();
      executor.setCorePoolSize(3);
      executor.setMaxPoolSize(4);
      executor.setThreadNamePrefix("asyn-task-thread-");
      executor.setWaitForTasksToCompleteOnShutdown(true);
      executor.initialize();
      return executor;
  }
  @Override
  public AsyncUncaughtExceptionHandler  
         getAsyncUncaughtExceptionHandler() {
     return new AsyncUncaughtExceptionHandler() {
   
        @Override
        public void handleUncaughtException(Throwable ex, 
           Method method, Object... params) {
           System.out.println("Exception: " + ex.getMessage());
           System.out.println("Method Name: " + method.getName());
           ex.printStackTrace();
        }
    };
  }
}