SOAP, JAVA i Business Connector

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
Michal.Nowak
Posty: 99
Rejestracja: wt cze 19, 2007 10:21 am
Lokalizacja: Kraków
Has thanked: 2 times
Been thanked: 5 times

SOAP, JAVA i Business Connector

Post autor: Michal.Nowak »

Witam wszystkich.

Mam mały problem, może nie do końca związany z ABAP-em no ale może ktoś będzie mógł Mi pomóc, więc:

1. Stworzyłem serwis w BC, który wywołuje prostą funkcję RFC w SAP(do parametru wejściowego "IN" dodaje liczbę 10 i zwracam w parametrze "OUT").
2. Serwis ten ma jeden argument wejściowy "IN" i wyjściowy "OUT".
3.W zakładce ustawienia ustawiłem dane dla "Universal Name":
-Namespace name: http://www.test.java/JAVA/
-Local name: getJAVA
4.Chciałbym wywołać ten serwis z poziomu JAVY przy wykorzystaniu SOAP.

Napisałem program:

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;

import javax.mail.MessagingException;
import javax.mail.internet.MimeBodyPart;

import org.apache.soap.Constants;
import org.apache.soap.Fault;
import org.apache.soap.SOAPException;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;


public class TEST1 {
public static void main(String[] args){

//build a Call object
URL url;

Call call = new Call();
call.setTargetObjectURI("http://www.test.java/JAVA/");
call.setMethodName("getJAVA");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

//creating a parameter list
Vector params = new Vector();
params.addElement(new Parameter("IN", String.class,"1",Constants.NS_URI_SOAP_ENC));


//adding the parameter(s) to the Call object
call.setParams(params);

System.out.println(call.getParams());

try {
url = new URL ("http://skasv04:3125/soap/rpc");
try {
Response res = call.invoke(url, "");
if( res.generatedFault() ==false)
{
Parameter retValue = res.getReturnValue();
Object value = retValue.getValue();
System.out.println(value);
}else
{
Fault fault = res.getFault();
System.out.println(" Fault code: " + fault.getFaultCode());
System.out.println(" Fault string: "+fault.getFaultString());
}

} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

No i oczywiście nie bardzo chce Mi to działać ;).

Dostaje wyjątek : [B2BCORE.0088.0001] SOAPException: [B2BSERV.0088.9134] Exception occuredd while processing the body of the message.

Czy może ktoś wie w czym tkwi problem ??
Pozdrawiam
Michał Nowak
yacol
Posty: 561
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 9 times
Been thanked: 165 times
Kontakt:

Post autor: yacol »

Rzuć proszę okiem jakie masz uprawnienia wykonywania serwisu w SAP BC. Miałem podobny problem i okazało się, że uprawnienia ACL dla serwisu SOAP/RPC powinny być ustawione na "Anonymous" (SAP BC w wersji 4.7). Ponadto możesz spróbować wywołać ten serwis z poziomu samego SAP BC korzystając z serwisu pub.client.soapRPC. Jeżeli tu będzie wszystko działało to problem leży najprawdopodobniej w warstwie SOAP pochodzącej ze stajni Apache. A tak poza konkursem: przecież serwis SAP BC można wywołać natywnie z poziomu swojego programu w Java. Jest to szybsze i bardziej niezawodne niż SOAP/RPC. Nie lepiej pójść w tę stronę? Albo jeszcze bardziej hard core'owo - skoro serwis BC wywołuje funkcję RFC w SAP to nie lepiej skorzystać z JCo i w ogóle nie zawracać sobie głowy SAP BC?

Pozdrawiam,

Jacek Witczak
Ostatnio zmieniony pt lis 14, 2008 4:32 pm przez yacol, łącznie zmieniany 1 raz.
Michal.Nowak
Posty: 99
Rejestracja: wt cze 19, 2007 10:21 am
Lokalizacja: Kraków
Has thanked: 2 times
Been thanked: 5 times

Post autor: Michal.Nowak »

Po zmianie ACL na "Anonymous" prawie zadziałało (musiałem dodać Deserializer'a i wtedy poszło) - Wielkie Dzięki.

Tylko samo rozwiązanie jest trochę toporne.
Wspomniałeś że jest możliwość bezpośredniego wywołania serwisu BC z poziomu JAVA, czy jest gdzieś jakaś dokumentacja na ten temat??

Niestety JCo odpada.
Pozdrawiam
Michał Nowak
yacol
Posty: 561
Rejestracja: śr kwie 04, 2007 4:32 pm
Lokalizacja: Poznań
Has thanked: 9 times
Been thanked: 165 times
Kontakt:

Post autor: yacol »

Oczywiście, że jest dostępna dokumentacja :) znajdziesz ją w PDF'ach dołączonych do SAP BC Developera. Dokładniej w SAPBC Developer Guide w rozdziale zatytułowanym: Creating Client Code/Building a Java Client.
Generalnie jest dostępny prosty generator z poziomu Developera. Zaznaczasz właściwy serwis, z menu Developera wybierasz Compose/Generate Code, potem wybierasz For calling this service from a client i klikasz przycisk Next. Następnie wybierasz, że ma to być wygenerowany przykład dla języka Java, klikasz Next i wskazujesz katalog gdzie mają powstać przykładowe pliki. W nich WSZYSTKO znajdziesz co będzie potrzebne. Pamiętaj tylko, żeby Twój kod w Javie widział plik client.jar (w classpath) z SAP BC. Szybko, prosto, wygodnie i... za darmo :mrgreen:

Szkoda, że JCo odpada bo do tego idealnie się nadaje a wykorzystywanie SAP BC tylko po to, żeby z Java wywołać jakąś funkcję RFC w SAP to wyciąganie armaty na muchę :wink: - zresztą - JCo to rdzeń SAP BC więc pośrednio i tak wykorzystujesz JCo 8)

Pozdrawiam,

Jacek Witczak
Michal.Nowak
Posty: 99
Rejestracja: wt cze 19, 2007 10:21 am
Lokalizacja: Kraków
Has thanked: 2 times
Been thanked: 5 times

Post autor: Michal.Nowak »

Super, wielkie dzieki. To jest bajka w porównaniu z SOAP.
Bawie sie już trochę BC ale tego jeszcze nie znałem, chyba w końcu pasuje porządnie przeglądnąć te pdf-y z dokumentacją.
Pozdrawiam
Michał Nowak
ODPOWIEDZ