BAEL-1416 quick guide to kong (#3448)
* BAEL-1416 quick guide to kong * refactor kong samples
This commit is contained in:
parent
3ecab4a0df
commit
7e7ccc7eb3
@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.kong;
|
||||||
|
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/stock")
|
||||||
|
public class QueryController {
|
||||||
|
|
||||||
|
private static int REQUEST_COUNTER = 0;
|
||||||
|
|
||||||
|
@GetMapping("/reqcount")
|
||||||
|
public int getReqCount(){
|
||||||
|
return REQUEST_COUNTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/{code}")
|
||||||
|
public String getStockPrice(@PathVariable String code){
|
||||||
|
REQUEST_COUNTER++;
|
||||||
|
if("BTC".equalsIgnoreCase(code))
|
||||||
|
return "10000";
|
||||||
|
else return "N/A";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
13
spring-boot/src/main/java/com/baeldung/kong/StockApp.java
Normal file
13
spring-boot/src/main/java/com/baeldung/kong/StockApp.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.kong;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
public class StockApp {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(StockApp.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
server.port=8080
|
server.port=9090
|
||||||
server.contextPath=/springbootapp
|
server.contextPath=/springbootapp
|
||||||
management.port=8081
|
management.port=8081
|
||||||
management.address=127.0.0.1
|
management.address=127.0.0.1
|
||||||
|
@ -0,0 +1,165 @@
|
|||||||
|
package com.baeldung.kong;
|
||||||
|
|
||||||
|
import com.baeldung.kong.domain.APIObject;
|
||||||
|
import com.baeldung.kong.domain.ConsumerObject;
|
||||||
|
import com.baeldung.kong.domain.KeyAuthObject;
|
||||||
|
import com.baeldung.kong.domain.PluginObject;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.http.*;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(webEnvironment = DEFINED_PORT, classes = StockApp.class)
|
||||||
|
public class KongAdminAPILiveTest {
|
||||||
|
|
||||||
|
private String getStockPrice(String code) {
|
||||||
|
try {
|
||||||
|
return restTemplate.getForObject(new URI("http://localhost:8080/stock/" + code), String.class);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void init() {
|
||||||
|
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired TestRestTemplate restTemplate;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenEndpoint_whenQueryStockPrice_thenPriceCorrect() {
|
||||||
|
String response = getStockPrice("btc");
|
||||||
|
assertEquals("10000", response);
|
||||||
|
|
||||||
|
response = getStockPrice("eth");
|
||||||
|
assertEquals("N/A", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong() throws Exception {
|
||||||
|
restTemplate.delete("http://localhost:8001/apis/stock-api");
|
||||||
|
|
||||||
|
APIObject stockAPI = new APIObject("stock-api", "stock.api", "http://localhost:8080", "/");
|
||||||
|
HttpEntity<APIObject> apiEntity = new HttpEntity<>(stockAPI);
|
||||||
|
ResponseEntity<String> addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class);
|
||||||
|
|
||||||
|
assertEquals(HttpStatus.CREATED, addAPIResp.getStatusCode());
|
||||||
|
|
||||||
|
addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class);
|
||||||
|
assertEquals(HttpStatus.CONFLICT, addAPIResp.getStatusCode());
|
||||||
|
String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class);
|
||||||
|
|
||||||
|
assertTrue(apiListResp.contains("stock-api"));
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.set("Host", "stock.api");
|
||||||
|
RequestEntity<String> requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
|
||||||
|
ResponseEntity<String> stockPriceResp = restTemplate.exchange(requestEntity, String.class);
|
||||||
|
|
||||||
|
assertEquals("10000", stockPriceResp.getBody());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenKongAdminAPI_whenAddAPIConsumer_thenAdded() {
|
||||||
|
restTemplate.delete("http://localhost:8001/consumers/eugenp");
|
||||||
|
|
||||||
|
ConsumerObject consumer = new ConsumerObject("eugenp");
|
||||||
|
HttpEntity<ConsumerObject> addConsumerEntity = new HttpEntity<>(consumer);
|
||||||
|
ResponseEntity<String> addConsumerResp = restTemplate.postForEntity("http://localhost:8001/consumers/", addConsumerEntity, String.class);
|
||||||
|
|
||||||
|
assertEquals(HttpStatus.CREATED, addConsumerResp.getStatusCode());
|
||||||
|
|
||||||
|
addConsumerResp = restTemplate.postForEntity("http://localhost:8001/consumers", addConsumerEntity, String.class);
|
||||||
|
assertEquals(HttpStatus.CONFLICT, addConsumerResp.getStatusCode());
|
||||||
|
|
||||||
|
String consumerListResp = restTemplate.getForObject("http://localhost:8001/consumers/", String.class);
|
||||||
|
assertTrue(consumerListResp.contains("eugenp"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAPI_whenEnableAuth_thenAnonymousDenied() throws Exception {
|
||||||
|
String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class);
|
||||||
|
if (!apiListResp.contains("stock-api")) {
|
||||||
|
givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong();
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginObject authPlugin = new PluginObject("key-auth");
|
||||||
|
ResponseEntity<String> enableAuthResp = restTemplate.postForEntity("http://localhost:8001/apis/stock-api/plugins", new HttpEntity<>(authPlugin), String.class);
|
||||||
|
|
||||||
|
assertTrue(HttpStatus.CREATED == enableAuthResp.getStatusCode() || HttpStatus.CONFLICT == enableAuthResp.getStatusCode());
|
||||||
|
|
||||||
|
String pluginsResp = restTemplate.getForObject("http://localhost:8001/apis/stock-api/plugins", String.class);
|
||||||
|
assertTrue(pluginsResp.contains("key-auth"));
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.set("Host", "stock.api");
|
||||||
|
RequestEntity<String> requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
|
||||||
|
ResponseEntity<String> stockPriceResp = restTemplate.exchange(requestEntity, String.class);
|
||||||
|
assertEquals(HttpStatus.UNAUTHORIZED, stockPriceResp.getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAPIAuthEnabled_whenAddKey_thenAccessAllowed() throws Exception {
|
||||||
|
String apiListResp = restTemplate.getForObject("http://localhost:8001/apis/", String.class);
|
||||||
|
if (!apiListResp.contains("stock-api")) {
|
||||||
|
givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong();
|
||||||
|
}
|
||||||
|
|
||||||
|
String consumerListResp = restTemplate.getForObject("http://localhost:8001/consumers/", String.class);
|
||||||
|
if (!consumerListResp.contains("eugenp")) {
|
||||||
|
givenKongAdminAPI_whenAddAPIConsumer_thenAdded();
|
||||||
|
}
|
||||||
|
|
||||||
|
final String consumerKey = "eugenp.pass";
|
||||||
|
KeyAuthObject keyAuth = new KeyAuthObject(consumerKey);
|
||||||
|
ResponseEntity<String> keyAuthResp = restTemplate.postForEntity("http://localhost:8001/consumers/eugenp/key-auth", new HttpEntity<>(keyAuth), String.class);
|
||||||
|
|
||||||
|
assertTrue(HttpStatus.CREATED == keyAuthResp.getStatusCode() || HttpStatus.CONFLICT == keyAuthResp.getStatusCode());
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.set("Host", "stock.api");
|
||||||
|
headers.set("apikey", consumerKey);
|
||||||
|
RequestEntity<String> requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
|
||||||
|
ResponseEntity<String> stockPriceResp = restTemplate.exchange(requestEntity, String.class);
|
||||||
|
|
||||||
|
assertEquals("10000", stockPriceResp.getBody());
|
||||||
|
|
||||||
|
headers.set("apikey", "wrongpass");
|
||||||
|
requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
|
||||||
|
stockPriceResp = restTemplate.exchange(requestEntity, String.class);
|
||||||
|
assertEquals(HttpStatus.FORBIDDEN, stockPriceResp.getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAdminAPIProxy_whenAddAPIViaProxy_thenAPIAdded() throws Exception {
|
||||||
|
APIObject adminAPI = new APIObject("admin-api", "admin.api", "http://localhost:8001", "/admin-api");
|
||||||
|
HttpEntity<APIObject> apiEntity = new HttpEntity<>(adminAPI);
|
||||||
|
ResponseEntity<String> addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class);
|
||||||
|
|
||||||
|
assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode());
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.set("Host", "admin.api");
|
||||||
|
APIObject baeldungAPI = new APIObject("baeldung-api", "baeldung.com", "http://ww.baeldung.com", "/");
|
||||||
|
RequestEntity<APIObject> requestEntity = new RequestEntity<>(baeldungAPI, headers, HttpMethod.POST, new URI("http://localhost:8000/admin-api/apis"));
|
||||||
|
addAPIResp = restTemplate.exchange(requestEntity, String.class);
|
||||||
|
|
||||||
|
assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package com.baeldung.kong;
|
||||||
|
|
||||||
|
import com.baeldung.kong.domain.APIObject;
|
||||||
|
import com.baeldung.kong.domain.TargetObject;
|
||||||
|
import com.baeldung.kong.domain.UpstreamObject;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||||
|
import org.springframework.http.*;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@SpringBootTest(webEnvironment = DEFINED_PORT, classes = StockApp.class)
|
||||||
|
public class KongLoadBalanceLiveTest {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void init() {
|
||||||
|
System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired TestRestTemplate restTemplate;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenKongAdminAPI_whenAddAPI_thenAPIAccessibleViaKong() throws Exception {
|
||||||
|
UpstreamObject upstream = new UpstreamObject("stock.api.service");
|
||||||
|
ResponseEntity<String> addUpstreamResp = restTemplate.postForEntity("http://localhost:8001/upstreams", new HttpEntity<>(upstream), String.class);
|
||||||
|
assertTrue(HttpStatus.CREATED == addUpstreamResp.getStatusCode() || HttpStatus.CONFLICT == addUpstreamResp.getStatusCode());
|
||||||
|
|
||||||
|
TargetObject testTarget = new TargetObject("localhost:8080", 10);
|
||||||
|
ResponseEntity<String> addTargetResp = restTemplate.postForEntity("http://localhost:8001/upstreams/stock.api.service/targets", new HttpEntity<>(testTarget), String.class);
|
||||||
|
assertTrue(HttpStatus.CREATED == addTargetResp.getStatusCode() || HttpStatus.CONFLICT == addTargetResp.getStatusCode());
|
||||||
|
|
||||||
|
TargetObject releaseTarget = new TargetObject("localhost:9090", 40);
|
||||||
|
addTargetResp = restTemplate.postForEntity("http://localhost:8001/upstreams/stock.api.service/targets", new HttpEntity<>(releaseTarget), String.class);
|
||||||
|
assertTrue(HttpStatus.CREATED == addTargetResp.getStatusCode() || HttpStatus.CONFLICT == addTargetResp.getStatusCode());
|
||||||
|
|
||||||
|
APIObject stockAPI = new APIObject("balanced-stock-api", "balanced.stock.api", "http://stock.api.service", "/");
|
||||||
|
HttpEntity<APIObject> apiEntity = new HttpEntity<>(stockAPI);
|
||||||
|
ResponseEntity<String> addAPIResp = restTemplate.postForEntity("http://localhost:8001/apis", apiEntity, String.class);
|
||||||
|
assertTrue(HttpStatus.CREATED == addAPIResp.getStatusCode() || HttpStatus.CONFLICT == addAPIResp.getStatusCode());
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.set("Host", "balanced.stock.api");
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
RequestEntity<String> requestEntity = new RequestEntity<>(headers, HttpMethod.GET, new URI("http://localhost:8000/stock/btc"));
|
||||||
|
ResponseEntity<String> stockPriceResp = restTemplate.exchange(requestEntity, String.class);
|
||||||
|
assertEquals("10000", stockPriceResp.getBody());
|
||||||
|
}
|
||||||
|
|
||||||
|
int releaseCount = restTemplate.getForObject("http://localhost:9090/stock/reqcount", Integer.class);
|
||||||
|
int testCount = restTemplate.getForObject("http://localhost:8080/stock/reqcount", Integer.class);
|
||||||
|
|
||||||
|
assertTrue(Math.round(releaseCount * 1.0 / testCount) == 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.baeldung.kong.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class APIObject {
|
||||||
|
|
||||||
|
public APIObject() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public APIObject(String name, String hosts, String upstream_url, String uris) {
|
||||||
|
this.name = name;
|
||||||
|
this.hosts = hosts;
|
||||||
|
this.upstream_url = upstream_url;
|
||||||
|
this.uris = uris;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private String hosts;
|
||||||
|
private String upstream_url;
|
||||||
|
private String uris;
|
||||||
|
|
||||||
|
public String getUris() {
|
||||||
|
return uris;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUris(String uris) {
|
||||||
|
this.uris = uris;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUpstream_url() {
|
||||||
|
return upstream_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpstream_url(String upstream_url) {
|
||||||
|
this.upstream_url = upstream_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHosts() {
|
||||||
|
return hosts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHosts(String hosts) {
|
||||||
|
this.hosts = hosts;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.baeldung.kong.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class ConsumerObject {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
private String custom_id;
|
||||||
|
|
||||||
|
public ConsumerObject(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConsumerObject(String username, String custom_id) {
|
||||||
|
this.username = username;
|
||||||
|
this.custom_id = custom_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCustom_id() {
|
||||||
|
return custom_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCustom_id(String custom_id) {
|
||||||
|
this.custom_id = custom_id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.baeldung.kong.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class KeyAuthObject {
|
||||||
|
|
||||||
|
public KeyAuthObject(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKey(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package com.baeldung.kong.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class PluginObject {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private String consumer_id;
|
||||||
|
|
||||||
|
public PluginObject(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getConsumer_id() {
|
||||||
|
return consumer_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConsumer_id(String consumer_id) {
|
||||||
|
this.consumer_id = consumer_id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package com.baeldung.kong.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class TargetObject {
|
||||||
|
|
||||||
|
public TargetObject(String target, int weight) {
|
||||||
|
this.target = target;
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String target;
|
||||||
|
private int weight;
|
||||||
|
|
||||||
|
public String getTarget() {
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTarget(String target) {
|
||||||
|
this.target = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWeight() {
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWeight(int weight) {
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.baeldung.kong.domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author aiet
|
||||||
|
*/
|
||||||
|
public class UpstreamObject {
|
||||||
|
|
||||||
|
public UpstreamObject(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user