27 Şubat 2017 Pazartesi

SSLContext Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.net.ssl.SSLContext;
Bu sınıf https bağlantısı açmak için kullanılabilir. Şöyle yaparız.
HttpsURLConnection con = ...;
...
con.setSSLSocketFactory (sslContext.getSocketFactory()); 
constructor - apache
Şöyle yaparız.
TrustStrategy acceptingTrustStrategy = 
(X509Certificate[] chain, String authType) -> true;

SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
  .loadTrustMaterial(null, acceptingTrustStrategy)
  .build();
getInstance metodu
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("SSLv3");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLS");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
getSocketFactory metodu
Bu sınıftan SSLSocketFactory alınabilir.
sslContext.getSocketFactory()
Şöyle yapabiliriz.
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
init metodu - KeyManager
SSLContext socket yaratmadan önce ilklendirilir ve tekrar ilklendirmenin bir yolu yoktur. Bir KeyManager verebiliriz. Böylece belli bir sertifikayı kullanabiliriz.
KeyManagerFactory kmf = ...;
...
sc.init(kmf.getKeyManagers(), null, null );
init metodu - TrustManager
Bir TrustManager belirtebiliriz. Böylece hangi isim alanlarına güveneceğimiz belirtiriz. Şöyle yapabiliriz.
sslContext.init(null, new TrustManager[] { tm }, null);
İlaveten rastgele sayı üreteci de belirtebiliriz. Şöyle yaparız
sslContext.init(null, new TrustManager[] { tm },new SecureRandom());
Şöyle yaparız.
TrustManagerFactory tmf = ...;
sslContext.init(null, tmf.getTrustManagers(), null);

23 Şubat 2017 Perşembe

Spring @RequestMapping Anotasyonu

Constructor
Json alabilmek için şöyle yaparız.
@RequestMapping(value="/users", headers="Accept=application/json",
method=RequestMethod.POST)
public void create(@RequestBody CustomerInfo customerInfo){
...
}
Şöyle yaparız.
@RequestMapping(method = RequestMethod.POST, produces = "application/json",
  value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestBody User user,
                                    HttpServletRequest httpServletRequest) {
  ...
}
RequestBody
Açıklaması şöyle
The @RequestBody method parameter annotation indicates that a method parameter should be bound to the value of the HTTP request body.
Şöyle yaparız.
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
  writer.write(body);
}
RequestBody ile alınabilecek nesne tipleri şöyle
The RequestMappingHandlerAdapter supports the @RequestBody annotation with the following default HttpMessageConverters:
  • ByteArrayHttpMessageConverter converts byte arrays.
  • StringHttpMessageConverter converts strings.
  • FormHttpMessageConverter converts form data to/from a MultiValueMap.
  • SourceHttpMessageConverter converts to/from a javax.xml.transform.Source.
RequestParam
Açıklaması şöyle
Annotation which indicates that a method parameter should be bound to a web request parameter. Supported for annotated handler methods in Servlet and Portlet environments.
Örnek 1
Elimizde şu http isteği olsun
GET: http://someserver.org/path?name=John&surname=Smith
Şöyle yaparız
public User getUser(@RequestParam(value = "name") String name, 
                    @RequestParam(value = "surname") String surname){ 
  ...  
}
Örnek 2
Eğer elimizde şöyle post veri varsa
application/x-www-form-urlencoded
Şöyle yaparız.
@RequestMapping("/url")
public String content(@RequestParam Long id, @RequestParam String name){...}
Eğer tüm parametreleri bir nesne altına toplamak istersek şöyle yaparız.
@RequestMapping("/url")
public String content(@ModelAttribute RestDTO restDTO){...}
Örnek 3
Açıklaması şöyle
If the method parameter is Map or MultiValueMap and a parameter name is not specified, then the map parameter is populated with all request parameter names and values.
Şöyle yaparız.
public String content(@RequestParam Map<String, String> restDTO){...}

Spring @Configuration Anotasyonu

Giriş
Şu satırı dahil ederiz.
import org.springframework.context.annotation.Configuration;
Tek başına kullanmak için şöyle yaparız.
@Configuration
public class MyApplicationContext {
  ...
}
Kalıtım ile kullanmak için şöyle yaparız.
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebMVCconfig extends WebMvcConfigurerAdapter {
  ...
}
İç Tanımlamalar
@Bean
Şöyle yaparız.
@Configuration
public class MyApplicationContext {

  @Bean(name = "someBean")
  public SomeClass getSomeClass() {
    return new SomeClassImpl(); 
  }
  ...
}
Dış Tanımlamalar
@EnableScheduling
Şöyle yaparız
@Configuration
@EnableAsync
@EnableScheduling
public class SpringBootConfiguration {

  @Bean
  public Executor getTaskExecutor() {
    return Executors.newScheduledThreadPool(10);
  }
}
@Import - Başka @Configuration İçindeki Sınıf'ı dahil etmek
Şöyle yaparız.
@Import(OtherConfiguration.class)
@Configuration
public class MyApplicationContext {
  ...
}
@ImportResource - Başka XML'i dahil etmek
Şöyle yaparız.
@ImportResource("another-application-context.xml")
@Configuration
public class MyApplicationContext {
  ...  
}

20 Şubat 2017 Pazartesi

Spring @Repository Anotasyonu

Giriş
Açıklaması şöyle
Teams implementing traditional J2EE patterns such as "Data Access Object" may also apply this stereotype to DAO classes, though care should be taken to understand the distinction between Data Access Object and DDD-style repositories before doing so. This annotation is a general-purpose stereotype and individual teams may narrow their semantics and use as appropriate.
Bu anotasyon ile fırlatılan exception, @Service anotasyonu ile fırlatılan exception'dan daha farklı.

InitialContext Sınıfı

constructor
Şöyle yaparız.
Context ctx = new InitialContext();
lookup metodu
Açıklaması şöyle
When you get the datasource through a JNDI lookup it is a shared resource configured in your container. And it's that container's job to manage the lifecycle of the datasource.
Şöyle yaparız.
DataSource ds = null;
try {
  ds = (DataSource) ctx.lookup("java:/comp/env/jdbc/project");
} catch (NamingException e) {
  e.printStackTrace();
}




18 Şubat 2017 Cumartesi

Spring @Controller Anotasyonu

Giriş
Bu anotasyonun çalışması için DispatcherServlet lazımdır. Açıklaması şöyle
Central dispatcher for HTTP request handlers/controllers, e.g. for web UI controllers or HTTP-based remote service exporters. Dispatches to registered handlers for processing a web request, providing convenient mapping and exception handling facilities.
This servlet is very flexible: It can be used with just about any workflow, with the installation of the appropriate adapter classes...

17 Şubat 2017 Cuma

JPA @PostUpdate Anotasyonu

Giriş
Tanımı şöyledir.
@Target(value=METHOD)
@Retention(value=RUNTIME)
public @interface PostUpdate

16 Şubat 2017 Perşembe

TimeUnit Sınıfı

Girşi
TimeUnit sınıfı concurrency paket içinde gelse de zaman hesaplaması için kullanılabilir. Ayrıca ChronoUnit sınıfı ile de bazı konularda benzerlik gösteriyor. Java 8 varsa bu sınıfı tercih etmemek gerekir.

convert metodu
Milisaniyeyi güne çevirmek için şöyle yaparız.
long ms = ...;
long noOfDays = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
sleep metodu
Şöyle yaparız.
TimeUnit.SECONDS.sleep(y)
Bu metod Thread.sleep ile aynıdır. Hatta metodun içi şöyledir.
public void sleep(long timeout) throws InterruptedException {
  if (timeout > 0) {
    long ms = toMillis(timeout);
    int ns = excessNanos(timeout, ms);
    Thread.sleep(ms, ns);
  }
}
Metod exception atar. Şöyle kullanmak gerekir.
try
{
  TimeUnit.SECONDS.sleep(1);
}
catch(InterruptedException e)
{...}
Sürekli catch yazmak hoş olmadığı için şöyle basitleştirebiliriz.
public void timeDelay(long t) {
  try {
    TimeUnit.SECONDS.sleep(t);
  } catch (InterruptedException e) {...}
}
toDays metodu
Şöyle yaparız.
long noOfDays = ...;
long a = TimeUnit.DAYS.toDays(noOfDays);

toSeconds
İki date arasındaki farkı saniye olarak şöyle buluruz.
String str = TimeUnit.MILLISECONDS.toSeconds(date1.getTime() - date2.getTime());