Skip to main content

Posts

Spring Boot - RestTemplate PATCH request fix

  In Spring Boot, you make a simple http request as below: 1. Define RestTemplate bean @Bean public RestTemplate restTemplate () { return new RestTemplate (); } 2. Autowire RestTemplate wherever you need to make Http calls @Autowire private RestTemplate restTemplate ; 3. Use auto-wired RestTemplate to make the Http call restTemplate . exchange ( "http://localhost:8080/users" , HttpMethod . POST , httpEntity , String . class ); Above setup works fine for all Http calls except PATCH. The following exception occurs if you try to make a PATCH request as above Exception: I / O error on PATCH request for \ "http://localhost:8080/users\" : Invalid HTTP method: PATCH ; nested exception is java . net . ProtocolException : Invalid HTTP method: PATCH Cause: Above exception happens because of the HttpURLConnection used by default in Spring Boot RestTemplate which is provided by the standard JDK HTTP library. More on this at this  bug Fix: This can b...

Cheatsheet: Kubernetes (K8s)

Namespaces: - Namespaces are used as a means to separate k8s resources Create Namespace kubectl create ns <--namespace--> Get all namespaces kubectl get namespaces Pod: - Pod allows you to run the application in a container - Usually the config for pods are defined in YAML, but you can create a quick pod using " run" command. kubectl run <--pod-name--> --image=nginx:2.3.5 --restart=Never --port=80 --namespace=<--namespace--> View pods details kubectl get pod -n <--namespace--> Describe pod: - This will provide much deeper insight into the pod kubectl describe pod -n <--namespace--> Modify pod *Replace xyzPod with your pod name below   kubectl set image pod xyzPod xyzPod=nginx --namespace=<--namespace--> Check Pod status: kubectl get pod -n <--namespace--> Shell into container: kubectl exec <--pod-name--> -it --namespace=<--namespace--> -- /bin/sh - exit from shell #exit Access Pod logs: kubectl logs <--pod-name--> -n...

Filter in Spring Boot

  We often share few common validations, logging scenarios, modify data for every request/response. To cover these scenarios with some common code, we need to intercept the incoming request and the outgoing response. To intercept the request-response, we can use the Filter interface provided in javax.servlet package. Methods provided by Filter interface:     -  init This method is invoked only once @Override public void init ( FilterConfig filterConfig ) throws ServletException { }     -  doFilter Invoked each time whenever client sends a request or server sends a response.  We can perform all our logic in this method @Override public void doFilter ( ServletRequest request , ServletResponse response , FilterChain chain ) throws IOException , ServletException { }     -  destroy clean up and removes filter from service @Override public void destroy () { } Dependencies that are needed to define filter in Sp...

Cheatsheet: Docker

  version check          docker version Create a container — setup File System Snapshot to be used docker create <image-name> Start a container — Executes startup command        -a - will show you all the logs/info coming out of the container  docker start -a <container-ID> run a docker container from image — Create + Start docker run <image-name> Default command override docker run <image-name> <override-command> Eg: "docker run busybox ls” List all running containers docker ps List all containers ever created docker ps --all Remove stopped containers      — have to redownload images  docker system prune   Logs from container docker logs <container-ID> Stop a container  — A hardware signal “SIGTERM" is sent to process, this gives time for program to clean-up and shut down — If container doesn’t stop in 10 secs after issuing SIGTERM, then do...

Cheatsheet: Kafka

       Start Zookeeper: bin/zookeeper-server-start.sh config/zookeeper.properties Start Kafka: bin/kafka-server-start.sh config/server.properties Create topic: kafka-topics.sh --zookeeper 127.0.0.1:2181 --topic <--topic-name--> --create --partitions 2 --replication-factor 1 list topics: kafka-topics.sh --zookeeper 127.0.0.1:2181 --list describe topic: kafka-topics.sh --zookeeper 127.0.0.1:2181 -describe --topic <--topic-name--> delete topic: kafka-topics.sh --zookeeper 127.0.0.1:2181 --topic <--topic-name--> --delete produce message to topic: kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 -topic <--topic-name--> consume messages from topic: kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 -topic <--topic-name--> --from-beginning Happy Coding  👨‍💻

Settings.xml for Maven, JFrog

For development and deployment of applications we always use an artifactory in real-time world to host artifacts needed for your build and also as a target to deploy artifacts generated in the build process. For Maven, to communicate with artifactory we need a settings.xml file which is usually located at "/User/rake/.m2/settings.xml" this file consists of how to authenticate to the artifactory servers and authorizations to read/ write to different locations like release, snapshots e.t.c... Settings.xml can be generated using the artifactory you're using which in my case is JFrog , but here's a sample settings file for your reference incase you're feeling lazy☺ <?xml version="1.0" encoding="UTF-8"?> <settings xsi:schemaLocation= "http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns= "http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi= "http://www.w3.org/2001/XM...

Find classes that use certain annotation - Java, Spring

Code to read classes that use a certain annotation: import org.springframework.beans.factory.config.BeanDefinition ; import org.springframework.context.ApplicationContext ; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider ; import org.springframework.core.type.filter.AnnotationTypeFilter ; ClassPathScanningCandidateComponentProvider classPathScanningCandidateComponentProvider = new ClassPathScanningCandidateComponentProvider ( false ); classPathScanningCandidateComponentProvider . addIncludeFilter ( new AnnotationTypeFilter ( CustomAnnotation . class )); Set < BeanDefinition > beanDefinitions = classPathScanningCandidateComponentProvider . findCandidateComponents ( "com.rake.demo.beans" ); for ( BeanDefinition beanDefinition: beanDefinitions ) { System . out . println ( beanDefinition . getBeanClassName ()); } Annotation: import java.lang.annotation.ElementType ; import java.lang.annotation.Reten...