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());

15 Şubat 2017 Çarşamba

JavaFX TextField Sınıfı

XML ile Tanımlama
Şöyle yaparız.
<GridPane fx:controller="com.mycompany.Layout">

  <TextField fx:id="httpsPort" promptText="text1" GridPane.columnIndex="1"
    GridPane.rowIndex="1" />
  <TextField fx:id="adminPort" promptText="text2" GridPane.columnIndex="1"
    GridPane.rowIndex="2" />

</GridPane>
xml ile değişken ismi aynı olmalıdırı. Şöyle yaparız.
public class Layout {

  @FXML
  private TextField httpsPort;
  @FXML
  private TextField adminPort;

}

14 Şubat 2017 Salı

BeanInfo Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.beans.BeanInfo;
getPropertyDescriptors metodu
Şöyle yaparız.
BeanInfo beanInfo = ...;
ProperDescriptor[] props = beanInfo.getPropertyDescriptors();