28 Haziran 2018 Perşembe

SpringBoot @EntityScan Anotasyonu

Giriş
Şu satırı dahil ederiz.
import org.springframework.boot.autoconfigure.domain.EntityScan;
Açıklaması şöyle. Yani @EntityScan ve @ComponentScan farklı işlere yarıyorlar.
The @EntityScan does not create beans. It only identifies which classes should be used by a specific persistence context. Since Spring boot 1.4 that includes JPA, MongoDB, neo4j, Casscandra and CouchBase.
Örnek
Şöyle yaparız.
@ComponentScan("org.example.base")
@EntityScan("org.example.base.entities")
public class MyConfig {

}
Örnek
Şöyle yaparız.
@SpringBootApplication
@EntityScan("a.b.c")
public class Main {
...
}
basePackages Alanı
Şöyle yaparız.
@EntityScan(basePackages = {"edu.miis.Entities"})
Bir projede basePackages alanı tanımlı olmasına rağmen Hibernate'in hbm.xml dosyalarını da yükledğini gördüm. Bunun engellemek için şöyle yapmak gerekti
spring.jpa.properties.hibernate.archive.autodetection=class

26 Haziran 2018 Salı

SpringBoot @AutoConfigureAfter Anotasyonu

Örnek
Şöyle yaparız.
@Component
@AutoConfigureAfter({ DataSourceAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class })
@PropertySource("classpath:flyway.properties")
public class FlywayConfig {

  @PostConstruct
  public void startMigrations() {
   ...
  }
}

SpringMVC WebApplicationContextUtils Sınıfı

getRequiredWebApplicationContexte metodu
Şöyle yaparız.
ApplicationContext applicationContext =alo
 WebApplicationContextUtils.getRequiredWebApplicationContext(context);

SpringContext ObjectProvider Arayüzü

Giriş
Eğer istenilen bean yoksa varsayılan bir bean ile devam etmeyi sağlar.

Örnek
Şöyle yaparız
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.ObjectProvider;

@Service
public class MyService {
  private final ObjectProvider<FooEvent> fooObjectFactory;


  public MyService(ObjectProvider<FooEvent> fooObjectFactory) {
    this.fooObjectFactory)  = fooObjectFactory) ;
  }

  public boolean purchase(PurchaseProductDto dto) {
    FooEvent fooEvent = fooObjectFactory) .getObject();
    ...
  }
}

SpringSecurity OAuth2 JdbcTokenStore Sınıfı

Giriş
Açıklaması şöyle.
The JdbcTokenStore is the JDBC version of the same thing, which stores token data in a relational database. Use the JDBC version if you can share a database between servers, either scaled up instances of the same server if there is only one, or the Authorization and Resources Servers if there are multiple components. To use the JdbcTokenStore you need "spring-jdbc" on the classpath.

SpringSecurity OAuth2 InMemoryTokenStore Sınıfı

Giriş
Açıklaması şöyle.
The default InMemoryTokenStore is perfectly fine for a single server (i.e. low traffic and no hot swap to a backup server in the case of failure). Most projects can start here, and maybe operate this way in development mode, to make it easy to start a server with no dependencies. read more
Örnek
Şöyle yaparız.
@Configuration
public class OAuth2ServerConfiguration {

  @Autowired
  private TokenStore tokenStore;

  @Bean
  public TokenStore tokenStore() {
    return new InMemoryTokenStore();
  }
  ...
} 

SpringWebSocket TextWebSocketHandler Sınıfı

Giriş
AbstractWebSocketHandler sınıfından kalıtır

İskeleti şöyledir. WebSocketHandler sınıfının broadcast yeteneği olmadığı için burada taklit ediliyor.
public class ServerWebSocketHandler extends TextWebSocketHandler
implements SubProtocolCapable {
  private final Set<WebSocketSession> sessions = new CopyOnWriteArraySet<>();
  @Override
  public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    sessions.add(session);
    TextMessage message = new TextMessage("one-time message from server");
    session.sendMessage(message);
   }
  @Override
  public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
    sessions.remove(session);
   }
  @Scheduled(fixedRate = 10000)
  void sendPeriodicMessages() throws IOException {
    for (WebSocketSession session : sessions) {
      if (session.isOpen()) {
        String broadcast = "server periodic message " + LocalTime.now();
        session.sendMessage(new TextMessage(broadcast));
      }
    }
  }
  @Override
  public void handleTextMessage(WebSocketSession session, TextMessage message)
throws Exception {
    String request = message.getPayload();
    String response = String.format("response from server to '%s'",
HtmlUtils.htmlEscape(request));
    session.sendMessage(new TextMessage(response));
  }
  @Override
  public void handleTransportError(WebSocketSession session, Throwable exception) {...}
  @Override
  public List<String> getSubProtocols() {
    return Collections.singletonList("subprotocol.demo.websocket");
  }
}
handleTextMessage metodu
İmzası şöyle.
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message)
  throws IOException, InterruptedException;
Örnek
Şöyle yaparız
@Component
public class WebSocketHandler extends AbstractWebSocketHandler {
  @Override
  public void handleTextMessage(WebSocketSession session, TextMessage message)
  throws IOException {
    
    String payload = message.getPayload();
    session.sendMessage(new TextMessage("..."));
  }
}

25 Haziran 2018 Pazartesi

SpringData LocalEntityManagerFactoryBean Sınıfı

Giriş
Normalde bu sınıfı tanımlamaya gerek yok. Eğer birden fazla veritabanına bağlanmak gerekiyorsa tanımlanabilir.

setPersistenceUnitName metodu
Şöyle yaparız.
@Bean
public LocalEntityManagerFactoryBean entityManagerFactory(){
  ocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
  factoryBean.setPersistenceUnitName("cpJpaPu");
  return factoryBean;
}

SpringBoot EntityManagerFactoryBuilder Sınıfı

Giriş
LocalContainerEntityManagerFactoryBean veya LocalEntityManagerFactoryBean nesnesi yaratır. Bu sınıflardan da JPA EntityManagerFactory nesnesi yaratılır.

dataSource metodu
Şöyle yaparız.
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
  EntityManagerFactoryBuilder builder, DataSource logDataSource) {
  return builder.dataSource(logDataSource)
    .packages("it.xxx.model.log")
    .persistenceUnit("log")
    .build();
}