Tuesday, 6 March 2018

Spring Security CheckList

Adding Spring boot security follows certain steps.

1) adding spring security starter in the pom file
2) creating a Security configuration class modified by @Configuration and @EnableWebSecurity
3) modify user repository so as to query a user or user password by its username
4) adding a Spring UserDetail class extends User. it implements UserDetails(Spring Security)
5) adding a @service component, i.e. UserDetailsService implements UserDetailsService.
6) Putting a set of roles in the User entity; User has a set roles
7) Adding a Role entity. One user has many roles.
8) Adding Security Test dependency, i.e. spring-security-test


Monday, 5 March 2018

More than one row with the given identifier was found: 8

First time met this hibernate exception.
I think this issue should due to one to one relationship.

One driver has one car; one car has one driver who is driving it.
driver 1--1 car

I defined the driver as an inverse side and car as an owning side.
it means in the car Table, it will keep a foreign key reference to the driver table.

in avoidance of such an exception.

1) setting foreign key only from the car Table, not from both sides.
Otherwise leading to this exception



org.hibernate.HibernateException: More than one row with the given identifier was found: 8, for class: com.mytaxi.domainobject.CarDO
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:86) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.entity.EntityLoader.loadByUniqueKey(EntityLoader.java:143) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.loadByUniqueKey(AbstractEntityPersister.java:2122) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.type.EntityType.loadByUniqueKey(EntityType.java:692) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.type.EntityType.resolve(EntityType.java:434) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:154) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:128) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1133) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.processResultSet(Loader.java:992) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.doQuery(Loader.java:930) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2617) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.doList(Loader.java:2600) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.Loader.list(Loader.java:2424) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getResultList(CriteriaQueryTypeQueryAdapter.java:50) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:118) ~[spring-data-jpa-1.10.6.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:82) ~[spring-data-jpa-1.10.6.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116) ~[spring-data-jpa-1.10.6.RELEASE.jar:na]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106) ~[spring-data-jpa-1.10.6.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) ~[spring-data-commons-1.12.6.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.5.RELEASE.jar:4.3.5.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.5.RELEASE.jar:4.3.5.RELEASE]

Thursday, 8 February 2018

Vaadin Spring Annotations



@SpringComponent: it is an alias of @Component; for Vaadin has already defined a component interface in usage. It declares a Vaadin bean it can be injected from Spring IoC. 

@SpringUI: let the Vaadin Spring plugin know which UI's should be accessible to the user and how they should be mapped. It accepts one optional String parameter indicating the UI path. If an explicit path is not provided or an empty string is used as the path, the UI will be mapped to the context root.

@SpringView: annotating views, so as to be found by SpringViewProvider
@SpringViewDisplay: to define where in the UI the views are to be shown, a bean or a class implementing ViewDisplay or extending (Single)ComponentContainer should be annotated with @SpringviewDisplay.

Single Component Container:  Window, Panel, and UI.

@UIScope: an annotation is specific to Vaadin Spring. Getting the same instance within the same UI, but injecting different instance as in different UI.
@ViewScope: it makes a life cycle of this injected bean view specific.

@VaadinSessionScope: Objects in VaadinSeesionScope is unique, and shared between all UIs open in the session. This is the most basic scope in Vaadin applications, useful for accessing data for the user associated with the session.

Standard Spring scopes can be used with some restrictions. Most commonly,
@Scope("prototype") to inject a new instance every time that bean is injected. The following cannot be used for Vaadin Components.
@Scope("singleton") can be used for thread-safe background services, the request and session scope of Spring do not match exactly the Vaadin session and do not work in background threads such as in operations even when using Ui.access()


Reference
Vaadin Spring

Saturday, 3 February 2018

Converting image from File to byte array





    private byte[] image2byte(File file, String mimeType) {
                if (!mimeType.contains("image")) {
                    return null;
                }

                byte[] imageByte = null;
                String formatName = getFormatName(mimeType);


                BufferedImage bi;
                try {
                    bi = ImageIO.read(file);

                    try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
                        boolean done = ImageIO.write(bi, formatName, baos);

                        baos.flush();

                        imageByte = baos.toByteArray();
                    }

                } catch (IOException ex) {
                    logger.error(ex.getMessage());
                }
                return imageByte;
            }





OR
 

    try {
            // Write the image to a buffer
            imagebuffer = new ByteArrayOutputStream();
            ImageIO.write(image, "png", imagebuffer);

            // Return a stream from the buffer
            return new ByteArrayInputStream(
                imagebuffer.toByteArray());
        } catch (IOException e) {
            return null;
        }


Monday, 8 January 2018

How to convert a primitive char array into a List


Arrays.asList()  only taking objects and convert them into a list; however primitive types, like char,  are not considered instances.

char[] chars = "I hate it".charArray();
List charList = Arrays.asList(chars);

char array is an object instance. so, here charList is a collection to hold a single array object, but not individual chars.

I didn't find a clever way, but having to convert a single char into its wrapper and then collect them into a collection.


import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 *
 * @author YNZ
 */
public class ConvertPrimArrayIntoList {

    public static void main(String[] args) {

        //a primitive array
        char[] chars = "I hate it. ".toCharArray();
        

        //
        List charList = new ArrayList<>();
        for (char c : chars) {
            charList.add(c);
        }

        System.out.println("size of charList " + charList.size());
        
        //in java 8
        String str = "what is happening? ";
        List listOfChar = str.chars().mapToObj(c -> new Character((char) c)).collect(Collectors.toList());
        System.out.println("List chars : " + listOfChar);

    }

}



Saturday, 6 January 2018

java.util.ConcurrentModificationException: null

This error happens when removing an element in a for- loop.  Using an iterator and its remove method then the error will be solved.


using an iterator to solve the concurrent modification exception, caused by using for loop.
            for (Iterator it = foundCopy.iterator(); it.hasNext();) {
                Yard yard = it.next();
                if (checked.contains(yard.getInterest())) {
                    it.remove();
                }
            }


Or usign java 8, streaming and then filtering. 

Thursday, 2 November 2017

Queue Deque LinkedList

Java Deque interfaces abstract both a Queue(FIFO) and a Stack(LIFO), and both can be implemented in a LinkedList or ArrayQueue.

For a stack: using Deque methods, i.e. push() at a head and pop() query and remove from a head.
For a queue: using Deque methods, i.e. offer() or add()  at a tail and poll()  query and remove from the head.

* peek() is a query at the head, but not removing it. it is different from pop() or poll();

package String;
import java.util.Deque;import java.util.LinkedList;
import java.util.stream.IntStream;
public class ReverseStringQMethod {

    public static void main(String[] args) {
        String str = "I love this game";        
        System.out.println(str);

        Deque deque = new LinkedList();
        //Used as a stack        str.chars().map(c -> (char) c).forEach(c -> deque.push((char) c));
        char[] reversed = new char[deque.size()];
        IntStream.range(0, reversed.length).forEach(i -> {
            reversed[i] = deque.pop();            System.out.print(reversed[i]);        });
    }
}

Can Jackson Deserialize Java Time ZonedDateTime

Yes, but must include JSR310. Thus ZonedDateTime can be deserialized directly from JSON response to POJO field. <dependency> <g...