Skip to content

Commit 1419e3b

Browse files
committed
Add Swagger support. Fix CORS problem
1 parent 03dc964 commit 1419e3b

11 files changed

Lines changed: 210 additions & 43 deletions

File tree

pom.xml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<version.plugin.war>2.4</version.plugin.war>
2424
<version.plugin.jgitflow>1.0-m3</version.plugin.jgitflow>
2525
<version.plugin.jrebel>1.1.5</version.plugin.jrebel>
26+
<version.wildfly.maven.plugin>1.0.2.Final</version.wildfly.maven.plugin>
2627

2728
<!-- Dependencies -->
2829
<version.dependency.javaee>7.0</version.dependency.javaee>
@@ -81,6 +82,82 @@
8182
<!--</configuration>-->
8283
<!--</plugin>-->
8384

85+
<!-- The JBoss AS plugin deploys your war to a local JBoss AS
86+
container -->
87+
<!-- To use, run: mvn package jboss-as:deploy -->
88+
<plugin>
89+
<groupId>org.wildfly.plugins</groupId>
90+
<artifactId>wildfly-maven-plugin</artifactId>
91+
<version>${version.wildfly.maven.plugin}</version>
92+
<executions>
93+
<execution>
94+
<id>deploy-mysql</id>
95+
<phase>package</phase>
96+
<goals>
97+
<goal>deploy-artifact</goal>
98+
</goals>
99+
<configuration>
100+
<groupId>mysql</groupId>
101+
<artifactId>mysql-connector-java</artifactId>
102+
<name>mysql-connector-java.jar</name>
103+
</configuration>
104+
</execution>
105+
<execution>
106+
<id>add-datasource</id>
107+
<phase>package</phase>
108+
<goals>
109+
<goal>add-resource</goal>
110+
</goals>
111+
<configuration>
112+
<address>subsystem=datasources</address>
113+
<resources>
114+
<resource>
115+
<address>data-source=java:jboss/datasources/MySQLDS</address>
116+
<properties>
117+
<!--<xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>-->
118+
<jndi-name>java:jboss/datasources/MySQLDS</jndi-name>
119+
<enabled>true</enabled>
120+
<pool-name>MySQLDS</pool-name>
121+
<use-java-contex>true</use-java-contex>
122+
<use-ccm>true</use-ccm>
123+
<connection-url>jdbc:mysql://localhost:3306/javaee7_angular</connection-url>
124+
<driver-name>mysql-connector-java.jar</driver-name>
125+
<user-name>javaee7_angular</user-name>
126+
<password>javaee7_angular</password>
127+
</properties>
128+
<!--<resources>-->
129+
<!--<resource>-->
130+
<!--<address>xa-datasource-properties=DatabaseName</address>-->
131+
<!--<properties>-->
132+
<!--<value>javaee7_angular</value>-->
133+
<!--</properties>-->
134+
<!--</resource>-->
135+
<!--<resource>-->
136+
<!--<address>xa-datasource-properties=ServerName</address>-->
137+
<!--<properties>-->
138+
<!--<value>localhost</value>-->
139+
<!--</properties>-->
140+
<!--</resource>-->
141+
<!--<resource>-->
142+
<!--<address>xa-datasource-properties=User</address>-->
143+
<!--<properties>-->
144+
<!--<value>javaee7_angular</value>-->
145+
<!--</properties>-->
146+
<!--</resource>-->
147+
<!--<resource>-->
148+
<!--<address>xa-datasource-properties=Password</address>-->
149+
<!--<properties>-->
150+
<!--<value>javaee7_angular</value>-->
151+
<!--</properties>-->
152+
<!--</resource>-->
153+
<!--</resources>-->
154+
</resource>
155+
</resources>
156+
</configuration>
157+
</execution>
158+
</executions>
159+
</plugin>
160+
84161
<plugin>
85162
<groupId>org.zeroturnaround</groupId>
86163
<artifactId>jrebel-maven-plugin</artifactId>
@@ -139,5 +216,12 @@
139216
<scope>compile</scope>
140217
</dependency>
141218

219+
<dependency>
220+
<groupId>mysql</groupId>
221+
<artifactId>mysql-connector-java</artifactId>
222+
<version>5.1.6</version>
223+
<scope>provided</scope>
224+
</dependency>
225+
142226
</dependencies>
143227
</project>

src/main/java/com/cortez/samples/javaee7angular/data/Person.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
*/
1010
@Entity
1111
public class Person {
12+
1213
@Id
13-
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id")
14-
@SequenceGenerator(name = "id", sequenceName = "id")
14+
@GeneratedValue(strategy = GenerationType.IDENTITY)
1515
private Long id;
1616

1717
private String name;

src/main/java/com/cortez/samples/javaee7angular/pagination/PaginatedListWrapper.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.cortez.samples.javaee7angular.pagination;
22

33
import com.cortez.samples.javaee7angular.data.Person;
4+
import com.wordnik.swagger.annotations.ApiModel;
5+
import com.wordnik.swagger.annotations.ApiModelProperty;
46

57
import javax.xml.bind.annotation.XmlElement;
68
import javax.xml.bind.annotation.XmlRootElement;
@@ -12,15 +14,34 @@
1214
*
1315
* @author Roberto Cortez
1416
*/
17+
@ApiModel(value = "PaginatedListWrapper", description = "A person in the company")
1518
@XmlRootElement
1619
public class PaginatedListWrapper implements Serializable {
20+
21+
/**
22+
* This is a comment on the property
23+
*
24+
* @value: currentPage2
25+
* @notes: This is an example
26+
*/
27+
@ApiModelProperty(value = "currentPage", notes = "The page we want to get from the results")
1728
private Integer currentPage;
29+
30+
@ApiModelProperty(value = "pageSize", notes = "How many items we want per page")
1831
private Integer pageSize;
32+
33+
@ApiModelProperty(value = "totalResults", notes = "The total number of results returned by the query")
1934
private Integer totalResults;
2035

36+
@ApiModelProperty(value = "sortFields", notes = "The fields used to sort the results")
2137
private String sortFields;
38+
39+
@ApiModelProperty(value = "sortDirections", notes = "The directions of the sort for each field used in the sort of the query")
2240
private String sortDirections;
41+
42+
2343
@XmlElement
44+
@ApiModelProperty(value = "list", notes = "The persons in the current page")
2445
private List<Person> list;
2546

2647
public Integer getCurrentPage() {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.cortez.samples.javaee7angular.rest;
2+
3+
import javax.servlet.*;
4+
import javax.servlet.annotation.WebFilter;
5+
import javax.servlet.http.HttpServletResponse;
6+
import java.io.IOException;
7+
8+
/**
9+
* CORS Support
10+
*
11+
* CORS is a technique to prevent websites from doing bad things with your
12+
* personal data. Most browsers + javascript toolkits not only support CORS
13+
* but enforce it, which has implications for your API server which supports
14+
* Swagger.
15+
*/
16+
@WebFilter(filterName = "ApiOriginFilter", urlPatterns = { "/*" })
17+
public class ApiOriginFilter implements Filter {
18+
@Override
19+
public void init(FilterConfig filterConfig) throws ServletException {
20+
}
21+
22+
@Override
23+
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
24+
HttpServletResponse res = (HttpServletResponse) servletResponse;
25+
res.addHeader("Access-Control-Allow-Origin", "*");
26+
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
27+
res.addHeader("Access-Control-Allow-Headers", "Content-Type");
28+
filterChain.doFilter(servletRequest, servletResponse);
29+
}
30+
31+
@Override
32+
public void destroy() {
33+
}
34+
}

src/main/java/com/cortez/samples/javaee7angular/rest/ApplicationConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import javax.ws.rs.core.Application;
44
import java.util.Set;
55

6-
@javax.ws.rs.ApplicationPath("rest")
6+
@javax.ws.rs.ApplicationPath("resources")
77
public class ApplicationConfig extends Application {
88

99
@Override

src/main/java/com/cortez/samples/javaee7angular/rest/PersonResource.java

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import com.cortez.samples.javaee7angular.data.Person;
44
import com.cortez.samples.javaee7angular.pagination.PaginatedListWrapper;
5+
import com.wordnik.swagger.annotations.Api;
6+
import com.wordnik.swagger.annotations.ApiOperation;
7+
import com.wordnik.swagger.annotations.ApiResponse;
8+
import com.wordnik.swagger.annotations.ApiResponses;
59

610
import javax.ejb.Stateless;
711
import javax.persistence.EntityManager;
@@ -10,6 +14,7 @@
1014
import javax.ws.rs.*;
1115
import javax.ws.rs.core.Application;
1216
import javax.ws.rs.core.MediaType;
17+
import javax.ws.rs.core.Response;
1318
import java.util.List;
1419

1520
/**
@@ -18,10 +23,11 @@
1823
* @author Roberto Cortez
1924
*/
2025
@Stateless
21-
@ApplicationPath("/resources")
26+
//@ApplicationPath("/resources")
2227
@Path("persons")
2328
@Consumes(MediaType.APPLICATION_JSON)
2429
@Produces(MediaType.APPLICATION_JSON)
30+
@Api(value = "/persons", description = "The persons manager")
2531
public class PersonResource extends Application {
2632
@PersistenceContext
2733
private EntityManager entityManager;
@@ -52,7 +58,12 @@ private PaginatedListWrapper findPersons(PaginatedListWrapper wrapper) {
5258

5359
@GET
5460
@Produces(MediaType.APPLICATION_JSON)
55-
public PaginatedListWrapper listPersons(@DefaultValue("1")
61+
@ApiOperation(value = "List all the persons",
62+
notes = "Ask for all the persons paginating the results")
63+
@ApiResponses(value = {
64+
@ApiResponse(code = 200, message = "OK", response = PaginatedListWrapper.class),
65+
@ApiResponse(code = 500, message = "Something wrong in Server")})
66+
public Response listPersons(@DefaultValue("1")
5667
@QueryParam("page")
5768
Integer page,
5869
@DefaultValue("id")
@@ -66,37 +77,55 @@ public PaginatedListWrapper listPersons(@DefaultValue("1")
6677
paginatedListWrapper.setSortFields(sortFields);
6778
paginatedListWrapper.setSortDirections(sortDirections);
6879
paginatedListWrapper.setPageSize(10);
69-
return findPersons(paginatedListWrapper);
80+
return Response.status(200).entity(findPersons(paginatedListWrapper)).build();
7081
}
7182

7283
@GET
73-
@Path("{id}")
74-
public Person getPerson(@PathParam("id") Long id) {
75-
return entityManager.find(Person.class, id);
84+
@Path("/{id}")
85+
@ApiOperation(value = "Get a person data",
86+
notes = "Ask for all the details of a person")
87+
@ApiResponses(value = {
88+
@ApiResponse(code = 200, message = "OK", response = Person.class),
89+
@ApiResponse(code = 500, message = "Something wrong in Server")})
90+
public Response getPerson(@PathParam("id") Long id) {
91+
Person p = entityManager.find(Person.class, id);
92+
return Response.status(200).entity(p).build();
7693
}
7794

7895
@POST
79-
public Person savePerson(Person person) {
96+
@ApiOperation(value = "Save or Update a person",
97+
notes = "Save the person data if no ID is in the entity or update it using the ID")
98+
@ApiResponses(value = {
99+
@ApiResponse(code = 200, message = "OK", response = Person.class),
100+
@ApiResponse(code = 500, message = "Something wrong in Server")})
101+
public Response savePerson(Person person) {
80102
if (person.getId() == null) {
81103
Person personToSave = new Person();
82104
personToSave.setName(person.getName());
83105
personToSave.setDescription(person.getDescription());
84106
personToSave.setImageUrl(person.getImageUrl());
85107
entityManager.persist(person);
86108
} else {
87-
Person personToUpdate = getPerson(person.getId());
109+
Response personToUpdateResp = getPerson(person.getId());
110+
Person personToUpdate = (Person) personToUpdateResp.getEntity();
88111
personToUpdate.setName(person.getName());
89112
personToUpdate.setDescription(person.getDescription());
90113
personToUpdate.setImageUrl(person.getImageUrl());
91114
person = entityManager.merge(personToUpdate);
92115
}
93116

94-
return person;
117+
return Response.status(200).entity(person).build();
95118
}
96119

97120
@DELETE
98-
@Path("{id}")
99-
public void deletePerson(@PathParam("id") Long id) {
100-
entityManager.remove(getPerson(id));
121+
@Path("/{id}")
122+
@ApiOperation(value = "Delete a given person",
123+
notes = "The server will delete the person of the given ID")
124+
@ApiResponses(value = {
125+
@ApiResponse(code = 200, message = "OK"),
126+
@ApiResponse(code = 500, message = "Something wrong in Server")})
127+
public Response deletePerson(@PathParam("id") Long id) {
128+
entityManager.remove(getPerson(id).getEntity());
129+
return Response.status(200).build();
101130
}
102131
}

src/main/java/com/cortez/samples/javaee7angular/rest/SwaggerJaxrsConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public void init(ServletConfig servletConfig) {
2121
super.init(servletConfig);
2222
SwaggerConfig swaggerConfig = new SwaggerConfig();
2323
ConfigFactory.setConfig(swaggerConfig);
24-
swaggerConfig.setBasePath("http://localhost:8080/swagger4javaee-web/rest");
24+
swaggerConfig.setBasePath("http://localhost:8080/javaee7-angular-3.2/resources");
2525
swaggerConfig.setApiVersion("1.0.0");
2626
ScannerFactory.setScanner(new DefaultJaxrsScanner());
2727
ClassReaders.setReader(new DefaultJaxrsApiReader());

src/main/resources/META-INF/persistence.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
<jta-data-source>java:jboss/datasources/MySQLDS</jta-data-source>
88
<properties>
99
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
10-
<property name="javax.persistence.schema-generation.create-source" value="script"/>
11-
<property name="javax.persistence.schema-generation.drop-source" value="script"/>
12-
<property name="javax.persistence.schema-generation.create-script-source" value="sql/create.sql"/>
13-
<property name="javax.persistence.schema-generation.drop-script-source" value="sql/drop.sql"/>
10+
<!--<property name="javax.persistence.schema-generation.create-source" value="script"/>-->
11+
<!--<property name="javax.persistence.schema-generation.drop-source" value="script"/>-->
12+
<!--<property name="javax.persistence.schema-generation.create-script-source" value="sql/create.sql"/>-->
13+
<!--<property name="javax.persistence.schema-generation.drop-script-source" value="sql/drop.sql"/>-->
1414
<property name="javax.persistence.sql-load-script-source" value="sql/load.sql"/>
1515
</properties>
1616
</persistence-unit>

src/main/resources/sql/create.sql

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
CREATE SEQUENCE ID START WITH 100
21
CREATE TABLE PERSON("ID" INTEGER not null primary key, "NAME" VARCHAR(50), "DESCRIPTION" VARCHAR(100), "IMAGEURL" VARCHAR(500))

src/main/resources/sql/drop.sql

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
DROP TABLE PERSON
2-
DROP SEQUENCE ID

0 commit comments

Comments
 (0)