Generated web service not receiving parameters - java

I've generated my web service from WSDL in Netbeans 7.1. For security concerns, I can't show it, but you can safely assume that it's ok, It's been production tested.
I can call the web-service ok. If I make the function return and then dump it, it even returns the correct values. What is wrong though, it never receives any parameters from the SOAP call. This is the way I invoke it in the index.jsp:
try {
Soap.ServiceService service = new Soap.ServiceService();
javax.xml.namespace.QName portQName = new javax.xml.namespace.QName("http://external.example.com/", "ServicePort");
String req = "<getTimestampCount xmlns=\"http://external.example.com/\"><msisdn>656</msisdn></getTimestampCount>";
javax.xml.ws.Dispatch<javax.xml.transform.Source> sourceDispatch = null;
sourceDispatch = service.createDispatch(portQName, javax.xml.transform.Source.class, javax.xml.ws.Service.Mode.PAYLOAD);
javax.xml.transform.Source result = sourceDispatch.invoke(new javax.xml.transform.stream.StreamSource(new java.io.StringReader(req)));
javax.xml.transform.TransformerFactory factory = javax.xml.transform.TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = factory.newTransformer();
java.io.StringWriter writer = new java.io.StringWriter();
javax.xml.transform.Result stringOut = new javax.xml.transform.stream.StreamResult(writer);
transformer.transform(result, stringOut);
writer.close();
out.print(writer.toString());
} catch (Exception ex) {
out.print(ex.getMessage());
}
And this is the function that returns the result:
public long getTimestampCount(java.lang.String msisdn) throws ParameterException, UnknownException_Exception {
//TODO implement this method
System.out.println(msisdn);
throw new UnsupportedOperationException("Not implemented yet.");
}
The printing always produces null. I can't for the life of me figure out why it's working, finding the right function, but not passing on the values.
Also, I've tested it with this code, and the values returned are correct:
try {
Soap.ServiceService service = new Soap.ServiceService();
Soap.Service port = service.ServicePort();
// TODO initialize WS operation arguments here
java.lang.String msisdn = "5";
// TODO process result here
long result = port.getTimestampCount(msisdn);
out.println("Result = "+result);
} catch (Exception ex) {
out.println(ex.getMessage());
// TODO handle custom exceptions here
}
as expected, this returns a value of 5. This would do fine if I wanted to generate the SOAP response by myself, but I would prefer to receive the response, like the first function does - as SOAP.
Anything else I should post to make this easier? If so, say it, and I'll try to provide everything needed.

I've since solved the problem with these webservices, but I still have no Idea what was wrong with this code.
What I ended up doing, was using the standard syntax, like in the last piece of code. That works perfecty.

Try to add following namespace to your method. It helped me in fixing the same issue.
<tns:getTimestampCount xmlns:tns=\"http://external.example.com/\"><msisdn>656</msisdn>
</tns:getTimestampCount>";

Related

Accessing the output of a command running in a docker container

I'm trying to upgrade from docker-java 0.10.3 to 3.2.7. This line has me completely stumped:
InputStream response =
dockerClient.attachContainerCmd(container.getId())
.withLogs(true)
.withStdErr(true)
.withStdOut(true)
.withFollowStream(true)
.exec();
I have managed to get round one error by changing it to
InputStream response =
dockerClient.attachContainerCmd(container.getId())
.withLogs(true)
.withStdErr(true)
.withStdOut(true)
.withFollowStream(true)
.exec(new AttachContainerResultCallback());
(but my IDE says that AttachContainerResultCallback is deprecated.) The problem is that .exec() used to return an InputStream. Now it returns a void. I need the InputStream, because the output of the commands running in the container needs to find it's way to the screen. This needs to be realtime, because the user needs to see the output of the commands as they are running; I can't just copy a file at the end.
How can I get hold of this InputStream?
The error is:
java: incompatible types: inference variable T has incompatible bounds
lower bounds: java.io.InputStream,com.github.dockerjava.api.async.ResultCallback<com.github.dockerjava.api.model.Frame>
lower bounds: com.github.dockerjava.core.command.AttachContainerResultCallback
Try it:
var outputStream = new PipedOutputStream();
var inputStream = new PipedInputStream(outputStream);
var response =
dockerClient.attachContainerCmd(container.getId())
.withLogs(false)
.withStdErr(true)
.withStdOut(true)
.withFollowStream(true)
.exec(new ResultCallback.Adapter<>() {
#Override
public void onNext(Frame object) {
System.out.println(object); //for example
try {
outputStream.write(object.getPayload());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
try {
response.awaitCompletion();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Variable inputStream will be what you are looking for.
P.S. In my case I do withLogs(false) because it blocks the current output and I get only part of the log. It probably has something to do with the container I'm connecting to.

How to check whether data is written in csv file using Java?

I am trying to write data into a CSV file using Spring Boot controller. But the data is not written the file.
I've tried with debugging but I couldn't find out which attribute I should look for.
When debugging, I noticed in Stream Encoder,
isOpen = true, writebuffer = null, ch = null, haveLeftoverChar = false, leftoverChar = '\u0000' 0, lcb = null
I got my data which I wished to get, perfectly right.
Here is my code:
FileWriter pw=null;
try {
pw = new FileWriter("C:\\Users\\hp\\Desktop\\all\\engine\\src\\main\\resources\\cases.csv", true);
} catch (IOException e) {
e.printStackTrace();
}
try {
pw.write("Registration Number: " + studentCase.getRegistrationNumber());
} catch (IOException e) {
e.printStackTrace();
}
try {
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
Do I have any mistakes in my controller code? and which attribute I should check to get to know whether the data is being written to the file or not?
Thanks in advance!
Do I have any mistakes in my controller code?
Yes
Your horrendous exception handling. Do not catch exceptions, then proceed as-if nothing went wrong. Something is likely going wrong and you're ignoring it.
If you check the output from the e.printStackTrace() calls, you will likely see that, but do you even know where that output goes?
Also, you should use try-with-resources. It was added in Java 7, so nobody should write code like that, not using it.
On a side note, you don't need to call flush(), since the close() method will do that for you.
So try this:
String filename = "C:\\Users\\hp\\Desktop\\all\\engine\\src\\main\\resources\\cases.csv";
try (FileWriter pw = new FileWriter(filename, true)) {
pw.write("Registration Number: " + studentCase.getRegistrationNumber());
}
Then add throws IOException to the Spring MVC controller method.
Oh, and there is no need to check if something was written. If the code reaches the next statement after the end of the try block, then something was written. That is now guaranteed, since you no longer ignore exceptions.

How to write to Nashorn error stream?

I use Nashorn scripts from a Java application. Java sets the context (including errorWriter) and everything just works fine...
BUT i haven't found the way to write to the error Stream from the nashorn script. Does anyone know ?
I tried to throw an error but it outputs in the scriptException, not in the error output Stream.
Thanks for any idea.
It looks like there is no built in function to write to stderr, like there is one to write to stdout (print).
But, you can set an attribute in the ScriptContext that has a function to write to it's error writer.
ScriptEngine se = ...;
ScriptContext sc = se.getContext();
sc.setAttribute("stderr", // name is 'stderr'
(Consumer<String>) str -> { // Object is a Consumer<String>
try {
Writer err = sc.getErrorWriter();
err.write(str);
err.flush();
} catch (Exception e) {
throw new Error(e);
}
},
ScriptContext.ENGINE_SCOPE // i.e. don't share with other engines
);
The reason to do it this way, instead of binding the error writer object directly, is that you can still change the error writer later, and it will still work.
Afterwards you could do this:
sc.setErrorWriter(new PrintWriter(new OutputStream() {
#Override
public void write(int b) throws IOException {
System.err.write(b);
}
}));
Which will write all the errors to the Java stderr (which is not the default btw).
Then from javascript you can do:
var error = function(message) { // A nice wrapper function
stderr.accept(message); // 'accept', since we passed a `Consumer<...>`
};
error('error'); // Will now print to Java's stderr

Rest Assured Framework complete JSON response matching

I am using Rest Assured Framework for API testing(Using Java).
At line (1),I am expecting error as there is mismatch in expected JSON response and Actual JSON response
But instead my code is executing successfully.
Can someone please tell me if I am doing anything wrong in below code?
public void test123() {
try {
//Read the Curl Request Input file
String json = input.readFromTextFile(
System.getProperty("user.dir") + "\\src\\test\\resources\\inputFile\\CurlDataFile.txt");
json = json.replaceAll(" ", "");
RestAssured.baseURI = "My URL";
given().
contentType("application/json").
body(json).
when().
post("").
then().
assertThat().body(matchesJsonSchemaInClasspath("testCurlOuput1.json")); (1)
} catch (IOException e) {
e.printStackTrace();
}catch(JsonSchemaValidationException e){
e.printStackTrace();
}
}
This is not directly relevant to REST-assured, but I suggest you take a look at Karate, because IMO it may be exactly what you are looking for.
One of the core features of Karate is that you can perform a full equality match of a JSON payload in one step.
And you can easily use JSON from files, which encourages the re-use of payloads across multiple tests.
You are catching all Exceptions. When your assertThat(..) fails, it throws an Exception. Put a breakpoint on the e.printStackTrace(); run in DEBUG mode and check that your AssertionException/Error isn't being caught.
Instead of catching exceptions, just add all Checked Exceptions to your test signature. If an exception is uncaught, it will fail the test. Alternatively, but less prefered in my opinion, resolve by putting fail(); in the catch block.
Finally I choose different library i.e. jayway.restassured library and then JSON Assert library (org.skyscreamer.jsonassert.JSONAssert) which will comapre actual and expected response.
public void test123() {
String postData = input.readFromTextFile(System.getProperty("user.dir") + "\\src\\test\\resources\\inputFile\\CurlDataFile.txt");
RestAssured.baseURI = "MY URL";
Response r = (Response)given().contentType("application/json").body(postData).when().post("");
String responseBody = r.getBody().asString();
String curlResponse = //I am providing expected Curl response here
//JSON Assertion for matching Expected and Actual response
JSONAssert.assertEquals(curlResponse, responseBody, false);
}
Also sometime we may want to avoid comparing particular field from JSON like some ID field which generate dynamically which we can do using JSON comparator
I am a fan of JSONAssert as this provides easy comparing of complete JSONs.
Just use .extract().response().getBody().asString() to get the string representation of the answer.
Complete example:
#Test
public void getReturnsExpectedDataForMailExampleCom() throws JSONException {
String response = get("/users/mail#example.com")
.then()
.statusCode(200)
.extract().response().getBody().asString();
JSONAssert.assertEquals(
"{\"email\":\"mail#example.com\",\"locale\":\"de-DE\"}",
response,
false);
}
Update The drawback is that the complete JSON is not output to stdout if the assertion fails.

ClassCastException in Mockito

I have the following method for which I'm trying to write unit test using Mockito. I'm fairly new to Mockito and trying to catch up.
Method to test
public synchronized String executeReadRequest(String url) throws Exception{
String result = null;
RestClient client = null;
Resource res = null;
logger.debug("Start executing GET request on "+url);
try{
client = getClient();
res = client.resource(url);
result = res.contentType(this.requestType).accept(this.responseType).get(String.class);
}
catch(Exception ioe){
throw new Exception(ioe.getMessage());
}
finally{
res = null;
client = null;
}
logger.info("GET request execution is over with result : "+result);
return result;
}
The unit test with Mockito
#Test
public void testRestHandler() throws Exception {
RestHandler handler = spy(new RestHandler());
RestClient mockClient = Mockito.mock(RestClient.class,Mockito.RETURNS_DEEP_STUBS);
Resource mockResource = Mockito.mock(Resource.class,Mockito.RETURNS_DEEP_STUBS);
doReturn(mockClient).when(handler).getClient();
Mockito.when(mockClient.resource(Mockito.anyString())).thenReturn(mockResource);
//ClassCastException at the below line
Mockito.when(mockResource.contentType(Mockito.anyString()).accept(Mockito.anyString()).get(Mockito.eq(String.class))).thenReturn("dummy read result");
handler.setRequestType(MediaType.APPLICATION_FORM_URLENCODED);
handler.setResponseType(MediaType.APPLICATION_JSON);
handler.executeReadRequest("abc");
}
But I'm getting a ClassCastException at the line
Mockito.when(mockResource.contentType(Mockito.anyString()).accept(Mockito.anyString()).get(Mockito.eq(String.class))).thenReturn("dummy read result");
Exception
java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$4b441c4d cannot be cast to java.lang.String
Appreciate any help to resolve this.
Many thanks.
This style of chaining during stubbing isn't correct:
Mockito.when(
mockResource.contentType(Mockito.anyString())
.accept(Mockito.anyString())
.get(Mockito.eq(String.class)))
.thenReturn("dummy read result");
Even though you've set the mocks to return deep stubs, Matchers work via side-effects, so this line doesn't achieve what you think it does. All three matchers (anyString, anyString, eq) are evaluated during the call to when, and the way you have it your code is likely to throw InvalidUseOfMatchersException at the slightest provocation—including adding unrelated code or verifications later.
This means your problem isn't the use of eq(String.class): It's that Mockito is trying to work the Class matcher in where it doesn't belong.
Instead, you'll need to stub specifically:
Mockito.when(mockResource.contentType(Mockito.anyString()))
.thenReturn(mockResource);
Mockito.when(mockResource.accept(Mockito.anyString()))
.thenReturn(mockResource);
Mockito.when(mockResource.get(Mockito.eq(String.class))) // or any(Class.class)
.thenReturn("dummy read response");
Note that some of the difficulty here is that Apache Wink uses the Builder pattern, which can be laborious in Mockito. (I've returned mockResource here, but you could imagine returning specific other Resource objects, at the expense of requiring them in exactly that order later.) A better way might be to use a default Answer that returns this whenever possible.
Solved it by changing the get call to
get(Mockito.any(Class.class))

Categories