Java EE Web Service (SOAP)

Witam po rocznej przerwie 🙂 w nadchodzących postach chciałbym poruszyć tematy związane z przydatnymi informacjami w codziennej pracy programisty.


 
 
 
 
 
 
 
 

W większości przypadków w pierwszej swojej pracy jako programista java będziesz musiał zmierzyć się z utrzymywaniem istniejących systemów bądź integracją z istniejącymi. Te zazwyczaj wykorzystują protokół SOAP (Simple Object Access Protocol) więcej np tutaj. W dzisiejszym wpisie utworzymy sobie przykładowy core, szablon – jak kto woli, web service’u wykorzystującego protokół SOAP który przyda nam się w następnych tematach poruszanych na blogu.

ItemService

 
Tworzymy interfejs dla naszego serwisu. W oparciu o wzorzec architektoniczny „Boundary-Control-Entity”, tutaj. Na tę chwilę udostępnimy jedną metodę do sprawdzenia przedmiotu o danym id.
 

public interface IItemRepository {

    Item checkItem(Long id);
}

 
Tworzymy model danych na jakim będziemy operować i jaki przesyłać będziemy w formacie xml. Nasz produkt ma tylko dwa atrybuty id oraz nazwa.
 

@XmlRootElement(name = "Item", namespace = "com.easyProgramming.item")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

    private Long id;
    private String name;

    public Item(){

    }

    public Item(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Item{"
                + "id=" + id
                + ", name=" + name + '}';
    }
}

 
Następnie udostępniamy nasz web service, który implementuje interfejs o którym pisałem wyżej. Jest to najbardziej zewnętrzna warstwa naszej aplikacji (boundary). Co tu się ciekawego dzieje:

  • @WebService – tworzy nasz serwer
  • @SOAPBinding(style = SOAPBinding.Style.RPC) – określa parametry naszego serwisu
  • @Inject – wsztrzykujemy instancje faktycznej implementacji serwisu
  • @WebMethod – określa atrybuty web metody
  • @WebResult – określa atrybuty odpowiedzi serwisu
  • @WebParam – określa atrybuty parametru web metody
  •  

    @WebService(name = "ItemService", serviceName = "ItemService",
            portName = "ItemService",
            targetNamespace = "http://easyProgramming.com")
    @SOAPBinding(style = SOAPBinding.Style.RPC)
    public class ItemService implements IItemRepository {
    
        @Inject
        @Component
        private IItemRepository itemServiceControl;
    
        @WebMethod(operationName = "checkItem")
        @WebResult(name = "Item")
        @Override
        public Item checkItem(@WebParam(name = "itemId") Long id) {
            return itemServiceControl.checkItem(id);
        }
    }
    

     
    ItemServiceControl to nasza warstwa (control) gdzie wykonywana jest faktyczna logika aplikacji, na tę chwilę niewiele się tu dziej w konstruktorze dorzucamy dwa obiekty do naszej listy, a w metodzie checkItem(Long id) wybieramy odpowiedni. Z ciekawostek adnotacja @Component pozwala na wstrzyknięcie różnych implementacji danego interfejsu w uruchamianym kontenerze, w naszym przypadku z tego samego interfejsu korzystają dwie warstwy ItemServiceControl oraz ItemService.
     

    @Stateless
    @Component
    public class ItemServiceControl implements IItemRepository {
    
        private List items;
    
        public ItemServiceControl() {
    
            items = new ArrayList<>();
    
            items.add(new Item(1L));
            items.add(new Item(2L));
        }
    
        public Item checkItem(Long id) {
            return items
                    .stream()
                    .filter((item) -> item.getId().equals(id))
                    .findFirst()
                    .orElse(null);
        }
    }
    

     
    A tutaj implementacja naszej adnotacji @Component więcej na ten temat tutaj oraz tutaj.
     

    @Qualifier
    @Retention(RUNTIME)
    @Target({TYPE, METHOD, FIELD, PARAMETER})
    public @interface Component {
    }
    

     

    Do uruchomienia aplikacji potrzebny nam będzie serwer aplikacyjny, osobiście korzystam z wildfly’a w wersji 12.1, który pobrać można stąd

    Po deploy’u aplikacji pod adresem powinnien wyświetlić się WSDL (Web Services Description Language) aplikacji http://localhost:8080/server/ItemService/ItemService?WSDL.

    Jak widać można zbudować prosty serwis z tylko jedną zależnością w pomie:) Kody projektu na tutaj.

    W następnych poście przyjrzymy się bliżej narzędziu za pomocą którego większości programistów na codzień odpytuje podobne serwisy w swoich projektach czyli soapUi.

    Hej!

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *