Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.spockframework</groupId>
|
||||||
|
<artifactId>groovy-spock</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>Spock Framework - Example Project</name>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.gmavenplus</groupId>
|
||||||
|
<artifactId>gmavenplus-plugin</artifactId>
|
||||||
|
<version>1.5</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
<goal>testCompile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.spockframework</groupId>
|
||||||
|
<artifactId>spock-core</artifactId>
|
||||||
|
<version>1.0-groovy-2.4</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
|
<artifactId>groovy-all</artifactId>
|
||||||
|
<version>2.4.7</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
class FirstSpecification extends Specification {
|
||||||
|
|
||||||
|
def "one plus one should equal two"() {
|
||||||
|
expect:
|
||||||
|
1 + 1 == 2
|
||||||
|
}
|
||||||
|
|
||||||
|
def "two plus two should equal four"() {
|
||||||
|
given:
|
||||||
|
int left = 2
|
||||||
|
int right = 2
|
||||||
|
|
||||||
|
when:
|
||||||
|
int result = left + right
|
||||||
|
|
||||||
|
then:
|
||||||
|
result == 4
|
||||||
|
}
|
||||||
|
|
||||||
|
def "Should be able to remove from list"() {
|
||||||
|
given:
|
||||||
|
def list = [1, 2, 3, 4]
|
||||||
|
|
||||||
|
when:
|
||||||
|
list.remove(0)
|
||||||
|
|
||||||
|
then:
|
||||||
|
list == [2, 3, 4]
|
||||||
|
}
|
||||||
|
|
||||||
|
def "Should get an index out of bounds when removing a non-existent item"() {
|
||||||
|
given:
|
||||||
|
def list = [1, 2, 3, 4]
|
||||||
|
|
||||||
|
when:
|
||||||
|
list.remove(20)
|
||||||
|
|
||||||
|
then:
|
||||||
|
thrown(IndexOutOfBoundsException)
|
||||||
|
list.size() == 4
|
||||||
|
}
|
||||||
|
|
||||||
|
def "numbers to the power of two"(int a, int b, int c) {
|
||||||
|
expect:
|
||||||
|
Math.pow(a, b) == c
|
||||||
|
|
||||||
|
where:
|
||||||
|
a | b | c
|
||||||
|
1 | 2 | 1
|
||||||
|
2 | 2 | 4
|
||||||
|
3 | 2 | 9
|
||||||
|
}
|
||||||
|
|
||||||
|
def "Should return default value for mock"() {
|
||||||
|
given:
|
||||||
|
def paymentGateway = Mock(PaymentGateway)
|
||||||
|
|
||||||
|
when:
|
||||||
|
def result = paymentGateway.makePayment(12.99)
|
||||||
|
|
||||||
|
then:
|
||||||
|
!result
|
||||||
|
}
|
||||||
|
|
||||||
|
def "Should return true value for mock"() {
|
||||||
|
given:
|
||||||
|
def paymentGateway = Mock(PaymentGateway)
|
||||||
|
paymentGateway.makePayment(20) >> true
|
||||||
|
|
||||||
|
when:
|
||||||
|
def result = paymentGateway.makePayment(20)
|
||||||
|
|
||||||
|
then:
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
def "Should verify notify was called"() {
|
||||||
|
given:
|
||||||
|
def notifier = Mock(Notifier)
|
||||||
|
|
||||||
|
when:
|
||||||
|
notifier.notify('foo')
|
||||||
|
|
||||||
|
then:
|
||||||
|
1 * notifier.notify('foo')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
interface Notifier {
|
||||||
|
void notify(String message)
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
interface PaymentGateway {
|
||||||
|
boolean makePayment(BigDecimal amount)
|
||||||
|
}
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
package org.baeldung.guava;
|
||||||
|
|
||||||
|
import com.google.common.math.DoubleMath;
|
||||||
|
import com.google.common.math.IntMath;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
|
||||||
|
import static org.hamcrest.core.IsEqual.equalTo;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
public class GuavaMathTest {
|
||||||
|
@Test
|
||||||
|
public void testIntMathAdd() {
|
||||||
|
try {
|
||||||
|
IntMath.checkedAdd(Integer.MAX_VALUE, 1);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
IntMath.checkedAdd(Integer.MIN_VALUE, -1);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int result1 = IntMath.checkedAdd(2, 1);
|
||||||
|
assertThat(result1, equalTo(3));
|
||||||
|
|
||||||
|
int result2 = IntMath.saturatedAdd(Integer.MAX_VALUE, 100);
|
||||||
|
assertThat(result2, equalTo(Integer.MAX_VALUE));
|
||||||
|
|
||||||
|
int result3 = IntMath.saturatedAdd(Integer.MIN_VALUE, -100);
|
||||||
|
assertThat(result3, equalTo(Integer.MIN_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntMathSubtract() {
|
||||||
|
try {
|
||||||
|
IntMath.checkedSubtract(Integer.MIN_VALUE, 1);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
IntMath.checkedSubtract(Integer.MAX_VALUE, -1);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
int result1 = IntMath.checkedSubtract(200, 100);
|
||||||
|
assertThat(result1, equalTo(100));
|
||||||
|
|
||||||
|
int result2 = IntMath.saturatedSubtract(Integer.MIN_VALUE, 1);
|
||||||
|
assertThat(result2, equalTo(Integer.MIN_VALUE));
|
||||||
|
|
||||||
|
int result3 = IntMath.saturatedSubtract(Integer.MAX_VALUE, -1);
|
||||||
|
assertThat(result3, equalTo(Integer.MAX_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntMathMultiply() {
|
||||||
|
try {
|
||||||
|
IntMath.checkedMultiply(Integer.MAX_VALUE, 2);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
IntMath.checkedMultiply(Integer.MIN_VALUE, 2);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int result1 = IntMath.checkedMultiply(21, 3);
|
||||||
|
assertThat(result1, equalTo(63));
|
||||||
|
|
||||||
|
int result2 = IntMath.saturatedMultiply(Integer.MAX_VALUE, 2);
|
||||||
|
assertThat(result2, equalTo(Integer.MAX_VALUE));
|
||||||
|
|
||||||
|
int result3 = IntMath.saturatedMultiply(Integer.MIN_VALUE, 2);
|
||||||
|
assertThat(result3, equalTo(Integer.MIN_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntMathPow() {
|
||||||
|
try {
|
||||||
|
IntMath.checkedPow(Integer.MAX_VALUE, 2);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
IntMath.checkedPow(Integer.MIN_VALUE, 3);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int result1 = IntMath.saturatedPow(3, 3);
|
||||||
|
assertThat(result1, equalTo(27));
|
||||||
|
|
||||||
|
int result2 = IntMath.saturatedPow(Integer.MAX_VALUE, 2);
|
||||||
|
assertThat(result2, equalTo(Integer.MAX_VALUE));
|
||||||
|
|
||||||
|
int result3 = IntMath.saturatedPow(Integer.MIN_VALUE, 3);
|
||||||
|
assertThat(result3, equalTo(Integer.MIN_VALUE));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntMathRound() {
|
||||||
|
int result1 = IntMath.divide(3, 2, RoundingMode.DOWN);
|
||||||
|
assertThat(result1, equalTo(1));
|
||||||
|
int result2 = IntMath.divide(3, 2, RoundingMode.UP);
|
||||||
|
assertThat(result2, equalTo(2));
|
||||||
|
|
||||||
|
int result3 = IntMath.log2(5, RoundingMode.FLOOR);
|
||||||
|
assertThat(result3, equalTo(2));
|
||||||
|
int result4 = IntMath.log2(5, RoundingMode.CEILING);
|
||||||
|
assertThat(result4, equalTo(3));
|
||||||
|
|
||||||
|
int result5 = IntMath.log10(11, RoundingMode.HALF_UP);
|
||||||
|
assertThat(result5, equalTo(1));
|
||||||
|
|
||||||
|
int result6 = IntMath.sqrt(4, RoundingMode.UNNECESSARY);
|
||||||
|
assertThat(result6, equalTo(2));
|
||||||
|
try {
|
||||||
|
IntMath.sqrt(5, RoundingMode.UNNECESSARY);
|
||||||
|
assertTrue(false);
|
||||||
|
} catch (ArithmeticException e) {
|
||||||
|
assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIntMathAdditionalFunctions() {
|
||||||
|
int result1 = IntMath.gcd(15, 20);
|
||||||
|
assertThat(result1, equalTo(5));
|
||||||
|
|
||||||
|
int result2 = IntMath.mod(8, 3);
|
||||||
|
assertThat(result2, equalTo(2));
|
||||||
|
|
||||||
|
boolean result3 = IntMath.isPowerOfTwo(8);
|
||||||
|
assertTrue(result3);
|
||||||
|
boolean result4 = IntMath.isPowerOfTwo(9);
|
||||||
|
assertFalse(result4);
|
||||||
|
|
||||||
|
int result5 = IntMath.factorial(4);
|
||||||
|
assertThat(result5, equalTo(24));
|
||||||
|
|
||||||
|
int result6 = IntMath.binomial(7, 3);
|
||||||
|
assertThat(result6, equalTo(35));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_detect_integer() {
|
||||||
|
boolean result1 = DoubleMath.isMathematicalInteger(2.0);
|
||||||
|
assertThat(result1, equalTo(true));
|
||||||
|
boolean result2 = DoubleMath.isMathematicalInteger(2.1);
|
||||||
|
assertThat(result2, equalTo(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_round_to_integer_types() {
|
||||||
|
int result3 = DoubleMath.roundToInt(2.5, RoundingMode.DOWN);
|
||||||
|
assertThat(result3, equalTo(2));
|
||||||
|
|
||||||
|
long result4 = DoubleMath.roundToLong(2.5, RoundingMode.HALF_UP);
|
||||||
|
assertThat(result4, equalTo(3L));
|
||||||
|
|
||||||
|
BigInteger result5 = DoubleMath.roundToBigInteger(2.5, RoundingMode.UP);
|
||||||
|
assertThat(result5, equalTo(new BigInteger("3")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_calculate_log_2() {
|
||||||
|
int result6 = DoubleMath.log2(10, RoundingMode.UP);
|
||||||
|
assertThat(result6, equalTo(4));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
About the application
|
||||||
|
---------------------
|
||||||
|
This application demonstrates the usage of JavaEE Web Annotations.
|
||||||
|
|
||||||
|
|
||||||
|
Contents of the application
|
||||||
|
---------------------------
|
||||||
|
1. AccountServlet.java - Demonstrates the @WebServlet and @ServletSecurity annotation.
|
||||||
|
|
||||||
|
NOTES: @WebServlet annotation designates the AccountServlet class as a Servlet component.
|
||||||
|
The usage of its parameters 'urlPatterns' & 'initParams' can be observed.
|
||||||
|
An initialization parameter 'type' is being set to denote the type of the bank account.
|
||||||
|
|
||||||
|
@ServletSecurity annotation imposes security constraints on the AccountServlet based on
|
||||||
|
the tomcat-users.xml (this code assumes there is a role 'admin' in your tomcat-users.xml)
|
||||||
|
|
||||||
|
N.B : To see @ServletSecurity annotation in action, please uncomment the annotation code
|
||||||
|
for @ServletSecurity.
|
||||||
|
|
||||||
|
|
||||||
|
2. BankAppServletContextListener.java - Demonstrates the @WebListener annotation for denoting a class as a ServletContextListener.
|
||||||
|
|
||||||
|
NOTES: Sets a Servlet context attribute ATTR_DEFAULT_LANGUAGE to 'english' on web application start up,
|
||||||
|
which can then be used throughout the application.
|
||||||
|
|
||||||
|
|
||||||
|
3. LogInFilter.java - Demonstrates the @WebFilter annotation.
|
||||||
|
|
||||||
|
NOTES: @WebFilter annotation designates the LogInFilter class as a Filter component.
|
||||||
|
It filters all requests to the bank account servlet and redirects them to
|
||||||
|
the login page.
|
||||||
|
|
||||||
|
N.B : To see @WebFilter annotation in action, please uncomment the annotation code for @WebFilter.
|
||||||
|
|
||||||
|
|
||||||
|
4. UploadCustomerDocumentsServlet.java - Demonstrates the @MultipartConfig annotation.
|
||||||
|
|
||||||
|
NOTES: @MultipartConfig anotation designates the UploadCustomerDocumentsServlet Servlet component,
|
||||||
|
to handle multipart/form-data requests.
|
||||||
|
To see it in action, deploy the web application an access the url: http://<your host>:<your port>/JavaEEAnnotationsSample/upload.jsp
|
||||||
|
Once you upload a file from here, it will get uploaded to D:/custDocs (assuming such a folder exists).
|
||||||
|
|
||||||
|
|
||||||
|
5. index.jsp - This is the welcome page.
|
||||||
|
|
||||||
|
NOTES: You can enter a deposit amount here and click on the 'Deposit' button to see the AccountServlet in action.
|
||||||
|
|
||||||
|
6. login.jsp - All requests to the AccountServlet are redirected to this page, if the LogInFilter is imposed.
|
||||||
|
|
||||||
|
7. upload.jsp - Demonstrates the usage of handling multipart/form-data requests by the UploadCustomerDocumentsServlet.
|
||||||
|
|
||||||
|
|
||||||
|
Building and Running the application
|
||||||
|
------------------------------------
|
||||||
|
To build the application:
|
||||||
|
|
||||||
|
1. Open the project in eclipse
|
||||||
|
2. Right click on it in eclispe and choose Run As > Maven build
|
||||||
|
3. Give 'clean install' under Goals
|
||||||
|
4. This should build the WAR file of the application
|
||||||
|
|
||||||
|
To run the application:
|
||||||
|
|
||||||
|
1. Right click on the project
|
||||||
|
2. Run as > Run on Server
|
||||||
|
3. This will start you Tomcat server and deploy the application (Provided that you have configured Tomcat in your eclipse)
|
||||||
|
4. You should now be able to access the url : http://<your host>:<your port>/JavaEEAnnotationsSample
|
||||||
+3
-7
@@ -36,19 +36,15 @@ public class AccountServlet extends javax.servlet.http.HttpServlet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||||
|
|
||||||
double accountBalance = 1000d;
|
double accountBalance = 1000d;
|
||||||
double interestRate = Double.parseDouble(request.getAttribute("interest").toString());
|
|
||||||
|
|
||||||
String paramDepositAmt = request.getParameter("dep");
|
String paramDepositAmt = request.getParameter("dep");
|
||||||
double depositAmt = Double.parseDouble(paramDepositAmt);
|
double depositAmt = Double.parseDouble(paramDepositAmt);
|
||||||
|
|
||||||
accountBalance = accountBalance + depositAmt;
|
accountBalance = accountBalance + depositAmt;
|
||||||
|
|
||||||
PrintWriter writer = response.getWriter();
|
PrintWriter writer = response.getWriter();
|
||||||
writer.println("<html> Balance of " + accountType + " account is: " +
|
writer.println("<html> Balance of " + accountType + " account is: " + accountBalance + "</html>");
|
||||||
accountBalance + "<br> This account bares an interest rate of " + interestRate +
|
|
||||||
" % </html>");
|
|
||||||
writer.flush();
|
writer.flush();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
package com.baeldung.javaeeannotations;
|
|
||||||
|
|
||||||
import javax.servlet.ServletRequestEvent;
|
|
||||||
import javax.servlet.ServletRequestListener;
|
|
||||||
import javax.servlet.annotation.WebListener;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
@WebListener
|
|
||||||
public class DepositRequestListener implements ServletRequestListener {
|
|
||||||
|
|
||||||
public void requestDestroyed(ServletRequestEvent event) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void requestInitialized(ServletRequestEvent evet) {
|
|
||||||
HttpServletRequest req = (HttpServletRequest)evet.getServletRequest();
|
|
||||||
req.setAttribute("interest", new Double(10));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
+5
@@ -1,6 +1,7 @@
|
|||||||
package com.baeldung.javaeeannotations;
|
package com.baeldung.javaeeannotations;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.annotation.MultipartConfig;
|
import javax.servlet.annotation.MultipartConfig;
|
||||||
@@ -24,6 +25,10 @@ public class UploadCustomerDocumentsServlet extends HttpServlet {
|
|||||||
for (Part part : request.getParts()) {
|
for (Part part : request.getParts()) {
|
||||||
part.write("myFile");
|
part.write("myFile");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PrintWriter writer = response.getWriter();
|
||||||
|
writer.println("<html>File uploaded successfully!</html>");
|
||||||
|
writer.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
organization in ThisBuild := "org.baeldung"
|
organization in ThisBuild := "org.baeldung"
|
||||||
|
|
||||||
// the Scala version that will be used for cross-compiled libraries
|
// the Scala version that will be used for cross-compiled libraries
|
||||||
scalaVersion in ThisBuild := "2.11.7"
|
scalaVersion in ThisBuild := "2.11.8"
|
||||||
|
|
||||||
lagomKafkaEnabled in ThisBuild := false
|
lagomKafkaEnabled in ThisBuild := false
|
||||||
|
|
||||||
@@ -38,4 +38,4 @@ lazy val weatherImpl = project("weather-impl")
|
|||||||
)
|
)
|
||||||
.dependsOn(weatherApi)
|
.dependsOn(weatherApi)
|
||||||
|
|
||||||
def project(id: String) = Project(id, base = file(id))
|
def project(id: String) = Project(id, base = file(id))
|
||||||
|
|||||||
@@ -67,6 +67,11 @@
|
|||||||
<artifactId>jsonassert</artifactId>
|
<artifactId>jsonassert</artifactId>
|
||||||
<version>${jsonassert.version}</version>
|
<version>${jsonassert.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.javers</groupId>
|
||||||
|
<artifactId>javers-core</artifactId>
|
||||||
|
<version>${javers.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@@ -78,6 +83,7 @@
|
|||||||
<javaassist.version>3.21.0-GA</javaassist.version>
|
<javaassist.version>3.21.0-GA</javaassist.version>
|
||||||
<assertj.version>3.6.2</assertj.version>
|
<assertj.version>3.6.2</assertj.version>
|
||||||
<jsonassert.version>1.5.0</jsonassert.version>
|
<jsonassert.version>1.5.0</jsonassert.version>
|
||||||
|
<javers.version>3.1.0</javers.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.baeldung.javers;
|
||||||
|
|
||||||
|
|
||||||
|
public class Address {
|
||||||
|
private String country;
|
||||||
|
|
||||||
|
public Address(String country) {
|
||||||
|
this.country = country;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.baeldung.javers;
|
||||||
|
|
||||||
|
public class Person {
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Person(Integer id, String name) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
package com.baeldung.javers;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class PersonWithAddress {
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
private List<Address> address;
|
||||||
|
|
||||||
|
public PersonWithAddress(Integer id, String name, List<Address> address) {
|
||||||
|
this.id = id;
|
||||||
|
this.name = name;
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Address> getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(List<Address> address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package com.baeldung.javers;
|
||||||
|
|
||||||
|
|
||||||
|
import org.javers.common.collections.Lists;
|
||||||
|
import org.javers.core.Javers;
|
||||||
|
import org.javers.core.JaversBuilder;
|
||||||
|
import org.javers.core.diff.Diff;
|
||||||
|
import org.javers.core.diff.changetype.NewObject;
|
||||||
|
import org.javers.core.diff.changetype.ObjectRemoved;
|
||||||
|
import org.javers.core.diff.changetype.ValueChange;
|
||||||
|
import org.javers.core.diff.changetype.container.ListChange;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
public class JaversTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenPersonObject_whenApplyModificationOnIt_thenShouldDetectChange() {
|
||||||
|
//given
|
||||||
|
Javers javers = JaversBuilder.javers().build();
|
||||||
|
|
||||||
|
Person person = new Person(1, "Michael Program");
|
||||||
|
Person personAfterModification = new Person(1, "Michael Java");
|
||||||
|
|
||||||
|
//when
|
||||||
|
Diff diff = javers.compare(person, personAfterModification);
|
||||||
|
|
||||||
|
//then
|
||||||
|
ValueChange change = diff.getChangesByType(ValueChange.class).get(0);
|
||||||
|
|
||||||
|
assertThat(diff.getChanges()).hasSize(1);
|
||||||
|
assertThat(change.getPropertyName()).isEqualTo("name");
|
||||||
|
assertThat(change.getLeft()).isEqualTo("Michael Program");
|
||||||
|
assertThat(change.getRight()).isEqualTo("Michael Java");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenListOfPersons_whenCompare_ThenShouldDetectChanges() {
|
||||||
|
//given
|
||||||
|
Javers javers = JaversBuilder.javers().build();
|
||||||
|
Person personThatWillBeRemoved = new Person(2, "Thomas Link");
|
||||||
|
List<Person> oldList = Lists.asList(new Person(1, "Michael Program"), personThatWillBeRemoved);
|
||||||
|
List<Person> newList = Lists.asList(new Person(1, "Michael Not Program"));
|
||||||
|
|
||||||
|
//when
|
||||||
|
Diff diff = javers.compareCollections(oldList, newList, Person.class);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertThat(diff.getChanges()).hasSize(3);
|
||||||
|
|
||||||
|
|
||||||
|
ValueChange valueChange = diff.getChangesByType(ValueChange.class).get(0);
|
||||||
|
assertThat(valueChange.getPropertyName()).isEqualTo("name");
|
||||||
|
assertThat(valueChange.getLeft()).isEqualTo("Michael Program");
|
||||||
|
assertThat(valueChange.getRight()).isEqualTo("Michael Not Program");
|
||||||
|
|
||||||
|
ObjectRemoved objectRemoved = diff.getChangesByType(ObjectRemoved.class).get(0);
|
||||||
|
assertThat(objectRemoved.getAffectedObject().get().equals(personThatWillBeRemoved)).isTrue();
|
||||||
|
|
||||||
|
ListChange listChange = diff.getChangesByType(ListChange.class).get(0);
|
||||||
|
assertThat(listChange.getValueRemovedChanges().size()).isEqualTo(1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenListOfPerson_whenPersonHasNewAddress_thenDetectThatChange() {
|
||||||
|
//given
|
||||||
|
Javers javers = JaversBuilder.javers().build();
|
||||||
|
|
||||||
|
PersonWithAddress person =
|
||||||
|
new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));
|
||||||
|
|
||||||
|
PersonWithAddress personWithNewAddress =
|
||||||
|
new PersonWithAddress(1, "Tom",
|
||||||
|
Arrays.asList(new Address("England"), new Address("USA")));
|
||||||
|
|
||||||
|
|
||||||
|
//when
|
||||||
|
Diff diff = javers.compare(person, personWithNewAddress);
|
||||||
|
List objectsByChangeType = diff.getObjectsByChangeType(NewObject.class);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertThat(objectsByChangeType).hasSize(1);
|
||||||
|
assertThat(objectsByChangeType.get(0).equals(new Address("USA")));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenListOfPerson_whenPersonRemovedAddress_thenDetectThatChange() {
|
||||||
|
//given
|
||||||
|
Javers javers = JaversBuilder.javers().build();
|
||||||
|
|
||||||
|
PersonWithAddress person =
|
||||||
|
new PersonWithAddress(1, "Tom", Arrays.asList(new Address("England")));
|
||||||
|
|
||||||
|
PersonWithAddress personWithNewAddress =
|
||||||
|
new PersonWithAddress(1, "Tom", Collections.emptyList());
|
||||||
|
|
||||||
|
|
||||||
|
//when
|
||||||
|
Diff diff = javers.compare(person, personWithNewAddress);
|
||||||
|
List objectsByChangeType = diff.getObjectsByChangeType(ObjectRemoved.class);
|
||||||
|
|
||||||
|
//then
|
||||||
|
assertThat(objectsByChangeType).hasSize(1);
|
||||||
|
assertThat(objectsByChangeType.get(0).equals(new Address("England")));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,6 +43,7 @@
|
|||||||
<!-- <module>gatling</module> --> <!-- not meant to run as part of the standard build -->
|
<!-- <module>gatling</module> --> <!-- not meant to run as part of the standard build -->
|
||||||
|
|
||||||
|
|
||||||
|
<module>groovy-spock</module>
|
||||||
<module>gson</module>
|
<module>gson</module>
|
||||||
<module>guava</module>
|
<module>guava</module>
|
||||||
<module>guava18</module>
|
<module>guava18</module>
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.failureanalyzer;
|
||||||
|
|
||||||
|
import javax.annotation.security.RolesAllowed;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class FailureAnalyzerApplication {
|
||||||
|
@RolesAllowed("*")
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.setProperty("security.basic.enabled", "false");
|
||||||
|
SpringApplication.run(FailureAnalyzerApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.failureanalyzer;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
|
||||||
|
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
|
||||||
|
import org.springframework.boot.diagnostics.FailureAnalysis;
|
||||||
|
|
||||||
|
public class MyBeanNotOfRequiredTypeFailureAnalyzer extends AbstractFailureAnalyzer<BeanNotOfRequiredTypeException> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FailureAnalysis analyze(Throwable rootFailure, BeanNotOfRequiredTypeException cause) {
|
||||||
|
return new FailureAnalysis(getDescription(cause), getAction(cause), cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getDescription(BeanNotOfRequiredTypeException ex) {
|
||||||
|
return "The bean " + ex.getBeanName() //
|
||||||
|
+ " could not be injected as " + ex.getRequiredType().getName() //
|
||||||
|
+ " because it is of type " + ex.getActualType().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getAction(BeanNotOfRequiredTypeException ex) {
|
||||||
|
return "Consider creating a bean with name "+ ex.getBeanName() //
|
||||||
|
+ " of type " + ex.getRequiredType().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.baeldung.failureanalyzer;
|
||||||
|
|
||||||
|
public class MyDAO {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.failureanalyzer;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository("myDAO")
|
||||||
|
public class MySecondDAO {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.failureanalyzer;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class MyService {
|
||||||
|
|
||||||
|
@Resource(name = "myDAO")
|
||||||
|
private MyDAO myDAO;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
/target/
|
||||||
|
.settings/
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
###The Course
|
||||||
|
The "REST With Spring" Classes: http://bit.ly/restwithspring
|
||||||
|
|
||||||
|
###Relevant Articles:
|
||||||
|
- [Quick Guide to @RestClientTest in Spring Boot](http://www.baeldung.com/restclienttest-in-spring-boot)
|
||||||
|
- [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters)
|
||||||
|
- [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring)
|
||||||
|
- [Introduction to WebJars](http://www.baeldung.com/maven-webjars)
|
||||||
|
- [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot)
|
||||||
|
- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan)
|
||||||
|
- [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder)
|
||||||
|
- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot)
|
||||||
|
- [How to Register a Servlet in a Java Web Application](http://www.baeldung.com/register-servlet)
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>spring-boot</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
<name>spring-boot</name>
|
||||||
|
<description>This is simple boot application for Spring boot actuator test</description>
|
||||||
|
|
||||||
|
<!-- Inherit defaults from Spring Boot -->
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>1.5.2.RELEASE</version>
|
||||||
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-security</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat.embed</groupId>
|
||||||
|
<artifactId>tomcat-embed-core</artifactId>
|
||||||
|
<version>${tomcat.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat.embed</groupId>
|
||||||
|
<artifactId>tomcat-embed-jasper</artifactId>
|
||||||
|
<version>${tomcat.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.dropwizard.metrics</groupId>
|
||||||
|
<artifactId>metrics-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.jayway.jsonpath</groupId>
|
||||||
|
<artifactId>json-path</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-mail</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.subethamail</groupId>
|
||||||
|
<artifactId>subethasmtp</artifactId>
|
||||||
|
<version>${subethasmtp.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.webjars</groupId>
|
||||||
|
<artifactId>bootstrap</artifactId>
|
||||||
|
<version>${bootstrap.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.webjars</groupId>
|
||||||
|
<artifactId>jquery</artifactId>
|
||||||
|
<version>${jquery.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>18.0</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tomcat</groupId>
|
||||||
|
<artifactId>tomcat-servlet-api</artifactId>
|
||||||
|
<version>${tomee-servlet-api.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<finalName>spring-boot</finalName>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>1.8</source>
|
||||||
|
<target>1.8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>pl.project13.maven</groupId>
|
||||||
|
<artifactId>git-commit-id-plugin</artifactId>
|
||||||
|
<version>${git-commit-id-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*IntegrationTest.java</exclude>
|
||||||
|
<exclude>**/*LiveTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
</plugins>
|
||||||
|
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>integration</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>integration-test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>test</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/*LiveTest.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<includes>
|
||||||
|
<include>**/*IntegrationTest.java</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<test.mime>json</test.mime>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- The main class to start by executing java -jar -->
|
||||||
|
<start-class>org.baeldung.boot.DemoApplication</start-class>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<spring.version>4.3.4.RELEASE</spring.version>
|
||||||
|
<git-commit-id-plugin.version>2.2.1</git-commit-id-plugin.version>
|
||||||
|
<jquery.version>3.1.1</jquery.version>
|
||||||
|
<bootstrap.version>3.3.7-1</bootstrap.version>
|
||||||
|
<subethasmtp.version>3.1.7</subethasmtp.version>
|
||||||
|
<tomee-servlet-api.version>8.5.11</tomee-servlet-api.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
||||||
+25
@@ -0,0 +1,25 @@
|
|||||||
|
package com.baeldung.annotation.servletcomponentscan;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.web.servlet.ServletComponentScan;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* using the following annotations are equivalent:
|
||||||
|
* <ul><li>
|
||||||
|
* <code>@ServletComponentScan</code>
|
||||||
|
* </li><li>
|
||||||
|
* <code>@ServletComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components")</code>
|
||||||
|
* </li><li>
|
||||||
|
* <code>@ServletComponentScan(basePackageClasses = {AttrListener.class, HelloFilter.class, HelloServlet.class, EchoServlet.class})</code>
|
||||||
|
* </li></ul>
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
@ServletComponentScan("com.baeldung.annotation.servletcomponentscan.components")
|
||||||
|
public class SpringBootAnnotatedApp {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(SpringBootAnnotatedApp.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.annotation.servletcomponentscan;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@ComponentScan(basePackages = "com.baeldung.annotation.servletcomponentscan.components")
|
||||||
|
public class SpringBootPlainApp {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
package com.baeldung.annotation.servletcomponentscan.components;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContextEvent;
|
||||||
|
import javax.servlet.ServletContextListener;
|
||||||
|
import javax.servlet.annotation.WebListener;
|
||||||
|
|
||||||
|
@WebListener
|
||||||
|
public class AttrListener implements ServletContextListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextInitialized(ServletContextEvent servletContextEvent) {
|
||||||
|
servletContextEvent
|
||||||
|
.getServletContext()
|
||||||
|
.setAttribute("servlet-context-attr", "test");
|
||||||
|
System.out.println("context init");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void contextDestroyed(ServletContextEvent servletContextEvent) {
|
||||||
|
System.out.println("context destroy");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
package com.baeldung.annotation.servletcomponentscan.components;
|
||||||
|
|
||||||
|
import javax.servlet.annotation.WebServlet;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.StandardCopyOption;
|
||||||
|
|
||||||
|
@WebServlet(name = "echo servlet", urlPatterns = "/echo")
|
||||||
|
public class EchoServlet extends HttpServlet {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doPost(HttpServletRequest request, HttpServletResponse response) {
|
||||||
|
try {
|
||||||
|
Path path = File
|
||||||
|
.createTempFile("echo", "tmp")
|
||||||
|
.toPath();
|
||||||
|
Files.copy(request.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
Files.copy(path, response.getOutputStream());
|
||||||
|
Files.delete(path);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
@@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.annotation.servletcomponentscan.components;
|
||||||
|
|
||||||
|
import javax.servlet.*;
|
||||||
|
import javax.servlet.annotation.WebFilter;
|
||||||
|
import javax.servlet.annotation.WebInitParam;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@WebFilter(urlPatterns = "/hello", description = "a filter for hello servlet", initParams = { @WebInitParam(name = "msg", value = "filtering ") }, filterName = "hello filter", servletNames = { "echo servlet" })
|
||||||
|
public class HelloFilter implements Filter {
|
||||||
|
|
||||||
|
private FilterConfig filterConfig;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException {
|
||||||
|
System.out.println("filter init");
|
||||||
|
this.filterConfig = filterConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
servletResponse
|
||||||
|
.getOutputStream()
|
||||||
|
.print(filterConfig.getInitParameter("msg"));
|
||||||
|
filterChain.doFilter(servletRequest, servletResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
System.out.println("filter destroy");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user