I inject a invoke statement(cajolingMe.cajoleMe();) to One of the webgoat's class(HammerHead.class). This method is a static method that called from a jar file which crated by fat-jar. I copy that jar to lib directory of [webgoat][3] web application.
When I decompile injected class there are no problem and syntax is true.
(injected codes bolded)
package org.owasp.webgoat;
**import cajoleMe.cajolingMe;**
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.owasp.webgoat.lessons.AbstractLesson;
import org.owasp.webgoat.lessons.Category;
import org.owasp.webgoat.lessons.WelcomeScreen;
import org.owasp.webgoat.lessons.admin.WelcomeAdminScreen;
import org.owasp.webgoat.session.Course;
import org.owasp.webgoat.session.ErrorScreen;
import org.owasp.webgoat.session.LessonTracker;
import org.owasp.webgoat.session.ParameterParser;
import org.owasp.webgoat.session.Screen;
import org.owasp.webgoat.session.UserTracker;
import org.owasp.webgoat.session.WebSession;
import org.owasp.webgoat.session.WebgoatContext;
...
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
Screen screen;
WebSession mySession;
screen = null;
mySession = null;
ServletContext context = getServletContext();
mySession = updateSession(request, response, context);
if(response.isCommitted())
{
try
{
writeScreen(mySession, screen, response);
}
catch(Throwable thr)
{
thr.printStackTrace();
log(request, (new StringBuilder()).append("Could not write error screen: ").append(thr.getMessage()).toString());
}
WebSession.returnConnection(mySession);
return;
}
screen = makeScreen(mySession);
if(response.isCommitted())
{
try
{
writeScreen(mySession, screen, response);
}
catch(Throwable thr)
{
thr.printStackTrace();
log(request, (new StringBuilder()).append("Could not write error screen: ").append(thr.getMessage()).toString());
}
WebSession.returnConnection(mySession);
return;
}
if(screen instanceof AbstractLesson)
{
AbstractLesson lesson = (AbstractLesson)screen;
if("GET".equals(request.getMethod()))
{
String uri = (new StringBuilder()).append(request.getRequestURI()).append("?").append(request.getQueryString()).toString();
if(!uri.endsWith(lesson.getLink()))
screen.getLessonTracker(mySession).incrementNumVisits();
} else
if("POST".equals(request.getMethod()) && mySession.getPreviousScreen() == mySession.getCurrentScreen())
screen.getLessonTracker(mySession).incrementNumVisits();
}
UserTracker userTracker = UserTracker.instance();
userTracker.update(mySession, screen);
log(request, (new StringBuilder()).append(**cajolingMe.cajoleMe(screen.getClass()).getName()).append(" | ")**.append(**cajolingMe.cajoleMe(cajolingMe.cajoleMe(mySession.getParser()))**.toString()).toString());
String userAgent = request.getHeader("user-agent");
String clientBrowser = "Not known!";
if(userAgent != null)
clientBrowser = userAgent;
request.setAttribute("client.browser", clientBrowser);
request.getSession().setAttribute("websession", mySession);
request.getSession().setAttribute("course", mySession.getCourse());
request.getRequestDispatcher(getViewPage(cajolingMe.cajoleMe(mySession))).forward(request, response);
try
{
writeScreen(mySession, screen, response);
}
catch(Throwable thr)
{
thr.printStackTrace();
log(request, (new StringBuilder()).append("Could not write error screen: ").append(thr.getMessage()).toString());
}
WebSession.returnConnection(mySession);
break MISSING_BLOCK_LABEL_631;
Throwable t;
t;
t.printStackTrace();
log((new StringBuilder()).append("ERROR: ").append(t).toString());
screen = new ErrorScreen(mySession, t);
try
{
writeScreen(mySession, screen, response);
}
catch(Throwable thr)
{
thr.printStackTrace();
log(request, (new StringBuilder()).append("Could not write error screen: ").append(thr.getMessage()).toString());
}
WebSession.returnConnection(mySession);
break MISSING_BLOCK_LABEL_631;
Exception exception;
exception;
try
{
writeScreen(mySession, screen, response);
}
catch(Throwable thr)
{
thr.printStackTrace();
log(request, (new StringBuilder()).append("Could not write error screen: ").append(thr.getMessage()).toString());
}
WebSession.returnConnection(mySession);
throw exception;
}
...
}
But When I run tomcat I saw this exception
31, 2013 12:31:59 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-127.0.0.1-8080
jan 31, 2013 12:31:59 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-127.0.0.1-8443
jan 31, 2013 12:31:59 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 549 ms
jan 31, 2013 12:32:00 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina <br/> jan 31, 2013 12:32:00 PM org.apache.catalina.core.StandardEngine start <br/>INFO: Starting Servlet Engine: Apache Tomcat/5.5.4
jan 31, 2013 12:32:00 PM org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
jan 31, 2013 12:32:00 PM org.apache.catalina.core.ApplicationContext log
INFO: org.apache.webapp.balancer.BalancerFilter: init(): ruleChain: Iorg.apache.webapp.balancer.RuleChain: Corg.apache.w bapp.balancer.rules.URLStringMatchRule: Target string: News / Redirect URL: http://www.cnn.com], Corg.apache.webapp.bal .ncer.rules.RequestParameterRule: Target param name: paramName / Target param paramUalue / Redirect URL: http://www.yahoo.com], Iorg.apache.webapp.balancer.rules.AcceptEverythingRule: Redirect URL: http://jakarta.apache.org]]
**-Marking serv let WebGoat as unavailable Servlet /WebGoat threw load() exception 'avax.servlet.ServletException: Error instantiating servlet class org.owasp.webgoat.HammerHead**
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1020)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:886)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:3817)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4079)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:755)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:886)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:849)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1079)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1011)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1003)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:437)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2010)
at org.apache.catalina.startup.Catalina.start(Catalina.java:537)
at sun.reflect.NativeMethodAccessorImpl.invokeO(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:271)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:409)
jan 31, 2013 12:32:01 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-127.0.0.1-8080 <br/> jan 31, 2013 12:32:01 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-127.0.0.1-8443
jan 31, 2013 12:32:01 PM org.apache.jk.common.ChannelSocket init
INFO: JH2: ajp13 listening on /127.0.0.1:8009 <br/> jan 31, 2013 12:32:01 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/11 config=null
jan 31, 2013 12:32:01 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1134 ms
and webgoat site is "HTTP Status 404"
I used [BCEL][5] for injection.
Where is problem?
Related
I am attempting to execute GraphQL queries agains the SWAPI end point
https://api.graphcms.com/simple/v1/swapi
using Retrofit
My Retrofit API resembles
#Headers("Content-Type: application/json")
#POST("swapi")
Single<Response<String>> query(#Body final String query);
My Retrofit Services
public class StarWarsService extends BaseService implements StarWarsApi {
private static final String BASE_URL = "https://api.graphcms.com/simple/v1/";
private static final StarWarsApi INSTANCE = new StarWarsService();
/**
*
* #return
*/
public static StarWarsApi instance() {
return INSTANCE;
}
private final StarWarsApi service;
/**
*
*/
private StarWarsService() {
final Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(okHttpClient)
.addCallAdapterFactory(Java8CallAdapterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create()).build();
service = retrofit.create(StarWarsApi.class);
}
#Override
public Single<Response<String>> query(String query) {
return service.query(query);
}
}
My main method
private static final String QUERY_STAR_WARS_0001 = "{ \"query\": \"{Starship(name:\"Millennium Falcon\") { name, hyperdriveRating, pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}\" }";
public static void main(String[] args) {
StarWarsService.instance().query(QUERY_STAR_WARS_0001).subscribe();
}
I get the following logs
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: --> POST https://api.graphcms.com/simple/v1/swapi
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: Content-Type: application/json
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: Content-Length: 145
aSep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO:
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: { "query": "{Starship(name:"Millennium Falcon") { name, hyperdriveRating, pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}" }
Sep 19, 2018 3:54:01 PM okhttp3.internal.platform.Platform log
INFO: --> END POST (145-byte body)
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: <-- 400 https://api.graphcms.com/simple/v1/swapi (325ms)
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: content-type: text/plain; charset=UTF-8
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: content-length: 291
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: date: Wed, 19 Sep 2018 14:54:39 GMT
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: server: akka-http/10.0.8
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: via: 1.1 cd9298825de9a9f64f66b3bc944bdd09.cloudfront.net (CloudFront), 1.1 3965285cac2a9323992ecbe26f94d453.cloudfront.net (CloudFront)
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: x-cache: Error from cloudfront
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: x-amz-cf-id: u17uzCW9lF5XI0o4_7hd5OatIqZshrKTlnX0G9iZWHb3CsJ8_Hobww==
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO:
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: The request content was malformed:
Unexpected character 'M' at input index 28 (line 1, position 29), expected '}':
{ "query": "{Starship(name:"Millennium Falcon") { name, hyperdriveRating, pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}" }
^
Sep 19, 2018 3:54:02 PM okhttp3.internal.platform.Platform log
INFO: <-- END HTTP (291-byte body)
When I can execute the same query with an online GraphQL "browser" OK?
What error have I made in my code/approach?
Whatever code is producing the JSON object is not properly escaping " characters inside the json values.
{ "query": "{Starship(name:"Millennium Falcon") { name, hyperdriveRating, pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}" }
should be
{ "query": "{Starship(name:\"Millennium Falcon\") { name, hyperdriveRating, pilots(orderBy: height_DESC) { name, height, homeworld {name} } }}" }
This question already has answers here:
JavaFX controller class not working
(1 answer)
Javafx - Can application class be the controller class
(2 answers)
Closed 5 years ago.
Issue:
After receiving a message from a the MessageListener class adds a message to a private final ObservableList<String> which in turn updates the GUI on change. the problem is that this happens inconsistently and for some unknown reason there seems to be 2 lists that interchange in adding the message to its list.
here is a log of this behavior:
INFO: Message received:
Text: SSN= 1223 Requested amount= 11€ time= 110
ID: ID:78-192.168.0.23(84:be:e3:92:5b:b3)-1-1519325025180
Reply to: null
Feb 22, 2018 7:43:45 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:SSN= 1223 Requested amount= 11€ time= 110
Feb 22, 2018 7:43:45 PM Bank.ABNAmbro addMessages
INFO: New size: 2
Feb 22, 2018 7:43:54 PM Bank.BankMessageListener onMessage
INFO: Message received:
Text: SSN= 1223 Requested amount= 11€ time= 110
ID: ID:82-192.168.0.23(84:be:e3:92:5b:b3)-1-1519325034484
Reply to: null
Feb 22, 2018 7:43:54 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:SSN= 1223 Requested amount= 11€ time= 110
Feb 22, 2018 7:43:54 PM Bank.ABNAmbro addMessages
INFO: New size: 9
Feb 22, 2018 7:43:55 PM Bank.BankMessageListener onMessage
INFO: Message received:
Text: SSN= 1223 Requested amount= 11€ time= 110
ID: ID:86-192.168.0.23(84:be:e3:92:5b:b3)-1-1519325035575
Reply to: null
Feb 22, 2018 7:43:55 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:SSN= 1223 Requested amount= 11€ time= 110
Feb 22, 2018 7:43:55 PM Bank.ABNAmbro addMessages
INFO: New size: 10
Feb 22, 2018 7:43:57 PM Bank.BankMessageListener onMessage
INFO: Message received:
Text: SSN= 1223 Requested amount= 11€ time= 110
ID: ID:90-192.168.0.23(84:be:e3:92:5b:b3)-1-1519325037074
Reply to: null
Feb 22, 2018 7:43:57 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:SSN= 1223 Requested amount= 11€ time= 110
Feb 22, 2018 7:43:57 PM Bank.ABNAmbro addMessages
INFO: New size: 11
Feb 22, 2018 7:43:58 PM Bank.BankMessageListener onMessage
INFO: Message received:
Text: SSN= 1223 Requested amount= 11€ time= 110
ID: ID:94-192.168.0.23(84:be:e3:92:5b:b3)-1-1519325038499
Reply to: null
Feb 22, 2018 7:43:58 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:SSN= 1223 Requested amount= 11€ time= 110
Feb 22, 2018 7:43:58 PM Bank.ABNAmbro addMessages
INFO: New size: 3
If I mock the MessageListener class to just add a String every few seconds the log shows 2 lists that have the same size.
Feb 22, 2018 9:12:16 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:Test 0
Feb 22, 2018 9:12:16 PM Bank.ABNAmbro addMessages
INFO: New sieze: 0
Feb 22, 2018 9:12:16 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:Test 0
Feb 22, 2018 9:12:16 PM Bank.ABNAmbro addMessages
INFO: New sieze: 0
Feb 22, 2018 9:12:17 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:Test 1
Feb 22, 2018 9:12:17 PM Bank.ABNAmbro addMessages
INFO: New sieze: 1
Feb 22, 2018 9:12:17 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:Test 1
Feb 22, 2018 9:12:17 PM Bank.ABNAmbro addMessages
INFO: New sieze: 1
Feb 22, 2018 9:12:18 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:Test 2
Feb 22, 2018 9:12:18 PM Bank.ABNAmbro addMessages
INFO: New sieze: 2
Feb 22, 2018 9:12:18 PM Bank.ABNAmbro addMessages
INFO: Adding message to List:Test 2
Feb 22, 2018 9:12:18 PM Bank.ABNAmbro addMessages
INFO: New sieze: 2
The Controller class:
package Bank;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;
import javax.jms.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ABNAmbro extends Application implements Bank {
private String tile = "bank";
private List<String> messages = new ArrayList<String>();
private final ObservableList<String> olMessages = FXCollections.observableArrayList(messages);
Logger logger = Logger.getLogger("ABNAmbro");
#FXML
ListView lsRequestView;
#Override
public void start(Stage primaryStage) throws IOException {
Parent root = FXMLLoader.load(getClass().getResource("/Bank/Bank.fxml"));
Scene scene = new Scene(root);
primaryStage.setTitle(tile);
primaryStage.setScene(scene);
primaryStage.show();
}
#FXML
public void initialize() {
lsRequestView.setItems(olMessages);
}
public ABNAmbro() throws NamingException {
tile = "ABNAmbro Loan Department.";
String queuename = "ABNBankqueue";
MessageListener messageListener = new BankMessageListener(this);
InitialContext initialContext = new InitialContext();
//JMS 2.0 lookup
ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup("java:comp/DefaultJMSConnectionFactory");
//Creating context to reseive messages
JMSContext context = connectionFactory.createContext();
Queue queue = (Queue) initialContext.lookup(queuename);
//create consumer and add a message listener to it so it can get its message async
JMSConsumer consumer = context.createConsumer(queue);
consumer.setMessageListener(messageListener);
}
#FXML
public void SendResponse(ActionEvent event) {
}
public void addMessages(final String messages) {
logger.log(Level.INFO,"Adding message to List:" + messages);
Platform.runLater(new Runnable() {
#Override
public void run() {
//adding message to list
olMessages.add(messages);
}
});
logger.log(Level.INFO, "New sieze: " + olMessages.size());
}
}
MessageListener:
package Bank;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BankMessageListener implements MessageListener{
private Bank bank;
private Logger logger;
public BankMessageListener(Bank bank){
this.bank = bank;
logger = Logger.getLogger("BankMessageListener");
}
public void onMessage(final Message message) {
try {
logger.log(Level.INFO,"Message received: \n" +
"Text: "+((TextMessage)message).getText()
+ "\nID: " +message.getJMSMessageID()
+ "\nReply to: " +((message.getJMSReplyTo() != null) ? message.getJMSReplyTo().toString() : "null")
);
bank.addMessages(((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
I have implemented simplecart to my project.
On clicking the checkout button it went to PayPal which I didn't wanted it to. So I changed the action URL in simplecart.js file to point to my servlet
action = opts.sandbox ? "cart_checkout" :"cart_checkout",
method = opts.method === "GET" ? "GET" : "POST";
It calls the servlet but I get a NumberFormatException in my servlet
Servlet
package com.kunal.servlet;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CartCheckout
*/
#WebServlet("/CartCheckout")
public class CartCheckout extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* #see HttpServlet#HttpServlet()
*/
public CartCheckout() {
super();
// TODO Auto-generated constructor stub
}
/**
* #see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String count=request.getParameter("ItemCount");
ArrayList<String> item_detail=new ArrayList<String>();
int cnt=Integer.parseInt(count);
for(int i=1;i<cnt+1;i++)
{
String name=request.getParameter("item_name_");
item_detail.add(name);
String price=request.getParameter("item_price_");
item_detail.add(price);
String qty=request.getParameter("item_quantity_");
item_detail.add(qty);
}
}
/**
* #see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String count=request.getParameter("ItemCount");
ArrayList<String> item_detail=new ArrayList<String>();
int cnt=Integer.parseInt(count);
for(int i=1;i<cnt+1;i++)
{
String name=request.getParameter("item_name_");
item_detail.add(name);
String price=request.getParameter("item_price_");
item_detail.add(price);
String qty=request.getParameter("item_quantity_");
item_detail.add(qty);
}
}
}
Stacktrace
Sep 01, 2014 1:15:51 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Sep 01, 2014 1:15:51 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Agro' did not find a matching property.
Sep 01, 2014 1:15:51 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
Sep 01, 2014 1:15:51 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Sep 01, 2014 1:15:51 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-nio-8009"]
Sep 01, 2014 1:15:51 PM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Sep 01, 2014 1:15:51 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 763 ms
Sep 01, 2014 1:15:51 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Sep 01, 2014 1:15:51 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.9
Sep 01, 2014 1:15:52 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
Sep 01, 2014 1:15:52 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8009"]
Sep 01, 2014 1:15:52 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1316 ms
Sep 01, 2014 1:15:59 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Cart_Checkout] in context with path [/Agro] threw exception
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:454)
at java.lang.Integer.parseInt(Integer.java:527)
at com.kunal.servlet.CartCheckout.doPost(CartCheckout.java:53)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
You should capture the request that is being sent to your webservice.
In the error you can see that you get a NumberFormatException: null. This suggests that your count String is null.
String count=request.getParameter("ItemCount");
This can happen when ItemCount is not a parameter of your request.
It would be good practice to test count (= "ItemCount" parameter) for null values in your code, so that you can return a nice looking error to your client.
It is because your count variable is null you can avoid it by
String count=request.getParameter("ItemCount");
if(count.length()>0){
int cnt=Integer.parseInt(count.trim());
// other logic
}
else{
//do nothing
}
The cause of the problem is quite straightforward:
int cnt=Integer.parseInt(count);
this is pointed out clearly from your stack trace:
at com.kunal.servlet.CartCheckout.doPost(CartCheckout.java:53)
A simple solution would be to check the count against null, hence change your doPost (..) implementation into:
/**
* #see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String count=request.getParameter("ItemCount");
ArrayList<String> item_detail=new ArrayList<String>();
int cnt= count == null 0 : Integer.parseInt(count);
for(int i=1;i<cnt+1;i++)
{
String name=request.getParameter("item_name_");
item_detail.add(name);
String price=request.getParameter("item_price_");
item_detail.add(price);
String qty=request.getParameter("item_quantity_");
item_detail.add(qty);
}
}
In order to ensure that you'll not encounter the same issue with empty strings, you can check also for empty strings. If using other libraries is an option I would suggest using StringUtils.isNotBlank(..)
then your parsing line becomes:
int cnt= StringUtils.isNotBlank(count) 0 : Integer.parseInt(count);
I wanted to use a profiling interceptor inside a jax-rs resource class. The interceptor works otherwise, but it causes problems inside a jax-rs resource class. I have put the demo code on github.
Here is a description of the problem.
First, here is a list of the main code.
Profiled
#InterceptorBinding
#Retention(RetentionPolicy.RUNTIME)
#Target({ElementType.METHOD, ElementType.TYPE})
public #interface Profiled {
}
Profiler
#Interceptor
#Profiled
public class Profiler {
#Inject
Logger logger;
#AroundInvoke
private Object profile( InvocationContext context ) throws Exception {
long startTime = System.currentTimeMillis();
try {
return context.proceed();
} finally {
long time = System.currentTimeMillis() - startTime;
logger.info( context.getMethod() + " took " + time + " milliseconds" );
}
}
}
UtilsProducer
public class UtilsProducer {
#Produces
private Logger createLogger( InjectionPoint point ) {
return Logger.getLogger( point.getMember().getDeclaringClass().getName() );
}
#Produces
private Client createClient() {
return ClientBuilder.newClient();
}
}
Foobar
public class Foobar {
public static final int SLEEP_TIME = 1000; // in milliseconds
#Inject
Logger logger;
public String hello() {
return "hello";
}
#Profiled
public long profiledCall() throws Exception {
long startTime = System.currentTimeMillis();
Thread.sleep( SLEEP_TIME );
return System.currentTimeMillis() - startTime;
}
}
RestFoobar
#Path("/")
public class RestFoobar {
public static final int SLEEP_TIME = 1000;
#Inject
private Logger logger;
#Inject
private Foobar foobar;
#Context
private UriInfo context;
#Path("hello")
#GET
public String hello() {
logger.info("Request from " + context.getRequestUri() );
return "hello";
}
#Path("profile")
#GET
#Profiled
public long profile() throws Exception {
logger.info("Request from " + context.getRequestUri() );
long startTime = System.currentTimeMillis();
Thread.sleep( SLEEP_TIME );
return System.currentTimeMillis() - startTime ;
}
}
FoobarTest
public class FoobarTest extends ArquillianWarBase {
#Inject
Foobar foobar;
#Test
public void shouldGetHello() {
assertEquals( "hello", foobar.hello() );
}
#Test
public void shouldHaveSlept() throws Exception {
assertTrue( foobar.profiledCall() >= Foobar.SLEEP_TIME );
}
}
RestFoobarTest
public class RestFoobarTest extends ArquillianWarBase {
#Inject
Client client;
static final String BASE_URL = "http://localhost:1119/demo/";
#Test
public void getHello() {
String url = BASE_URL + "hello";
Response response = client.target( url ).request(MediaType.TEXT_PLAIN_TYPE ).get();
String text = response.readEntity( String.class );
assertEquals( "hello", text );
}
#Test
public void getProfile() {
String url = BASE_URL + "profile";
Response response = client.target( url ).request(MediaType.TEXT_PLAIN_TYPE ).get();
long time = response.readEntity( Long.class );
assertTrue( time >= RestFoobar.SLEEP_TIME );
}
}
I use gradle wrapper to build the code. When I run ./gradlew test, which runs both FoobarTest and RestFoobarTest, I got this output:
demo.FoobarTest STANDARD_OUT
Found populator: org.glassfish.kernel.embedded.EmbeddedDomainXml
demo.FoobarTest STANDARD_ERROR
Apr 17, 2014 5:54:44 PM org.glassfish.security.services.impl.authorization.AuthorizationServiceImpl initialize
INFO: Authorization Service has successfully initialized.
Apr 17, 2014 5:54:44 PM org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.0.0.Final
Apr 17, 2014 5:54:45 PM com.sun.enterprise.v3.services.impl.GrizzlyProxy start
INFO: Grizzly Framework 2.3.1 started in: 13ms - bound to [/0.0.0.0:1,119]
Apr 17, 2014 5:54:45 PM com.sun.enterprise.v3.services.impl.GrizzlyService createNetworkProxy
INFO: Network listener https-listener on port 0 disabled per domain.xml
Apr 17, 2014 5:54:45 PM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRoot
INFO: Admin Console Adapter: context root: /admin
Apr 17, 2014 5:54:45 PM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRoot
INFO: Admin Console Adapter: context root: /admin
Apr 17, 2014 5:54:45 PM com.sun.enterprise.v3.admin.adapter.AdminEndpointDecider setGuiContextRoot
INFO: Admin Console Adapter: context root: /admin
Apr 17, 2014 5:54:45 PM com.sun.enterprise.v3.server.AppServerStartup postStartupJob
INFO: Undefined Product Name - define product and version info in config/branding 0.0.0 (0) startup time : Embedded (885ms), startup services(662ms), total(1,547ms)
Apr 17, 2014 5:54:45 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0 2013-05-03 14:50:15...
Apr 17, 2014 5:54:45 PM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run
INFO: JMXStartupService has disabled JMXConnector system
Apr 17, 2014 5:54:45 PM com.sun.enterprise.connectors.jms.util.JmsRaUtil getInstalledMqVersion
WARNING: RAR7000 : Check for a new version of MQ installation failed : /var/folders/cj/b2rlrrg56ts96zdyc69l59fh002jb1/T/gfembed906146914977552454tmp/lib/install/applications/jmsra/../imqjmsra.rar (No such file or directory):/var/folders/cj/b2rlrrg56ts96zdyc69l59fh002jb1/T/gfembed906146914977552454tmp/lib/install/applications/jmsra/imqjmsra.rar
demo.FoobarTest STANDARD_OUT
demo.war:
/WEB-INF/
/WEB-INF/beans.xml
/WEB-INF/glassfish-web.xml
/WEB-INF/web.xml
/WEB-INF/classes/
/WEB-INF/classes/demo/
/WEB-INF/classes/demo/UtilsProducer.class
/WEB-INF/classes/demo/RestFoobar.class
/WEB-INF/classes/demo/Profiled.class
/WEB-INF/classes/demo/Profiler.class
/WEB-INF/classes/demo/Foobar.class
demo.FoobarTest STANDARD_ERROR
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.SecurityLifecycle <init>
INFO: security.secmgroff
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.SecurityLifecycle onInitialization
INFO: sec.service.startup.enter
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.PolicyLoader loadPolicy
INFO: policy.loading
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate
INFO: realm.loaded.successfully
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate
INFO: realm.loaded.successfully
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate
INFO: realm.loaded.successfully
Apr 17, 2014 5:54:46 PM com.sun.enterprise.security.SecurityLifecycle onInitialization
INFO: sec.service.startup.exit
Apr 17, 2014 5:54:46 PM com.sun.enterprise.web.WebContainer createHttpListener
INFO: Created HTTP listener http-listener on host/port 0.0.0.0:1119
Apr 17, 2014 5:54:46 PM com.sun.enterprise.web.VirtualServer addProbes
SEVERE: Error adding HttpProbes. NetworkListener https-listeners GrizzlyProxy is NULL
Apr 17, 2014 5:54:46 PM com.sun.enterprise.web.WebContainer createHosts
INFO: Created virtual server server
Apr 17, 2014 5:54:47 PM org.apache.catalina.realm.JAASRealm setContainer
INFO: Setting JAAS app name glassfish-web
Apr 17, 2014 5:54:47 PM com.sun.enterprise.web.WebContainer loadSystemDefaultWebModules
INFO: Virtual server server loaded default web module
Apr 17, 2014 5:54:47 PM org.jboss.weld.bootstrap.WeldBootstrap <clinit>
INFO: WELD-000900 SNAPSHOT
Apr 17, 2014 5:54:48 PM org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer addServletWithDefaultConfiguration
INFO: Registering the Jersey servlet application, named javax.ws.rs.core.Application, with the following root resource and provider classes: [class demo.RestFoobar]
Apr 17, 2014 5:54:48 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0 2013-05-03 14:50:15...
Apr 17, 2014 5:54:48 PM com.sun.enterprise.web.WebApplication start
INFO: Loading application [demo] at [/demo]
Apr 17, 2014 5:54:48 PM org.glassfish.deployment.admin.DeployCommand execute
INFO: demo was successfully deployed in 2,328 milliseconds.
demo.FoobarTest > shouldGetHello PASSED
demo.FoobarTest > shouldHaveSlept STANDARD_ERROR
Apr 17, 2014 5:54:49 PM demo.Profiler profile
INFO: public long demo.Foobar.profiledCall() throws java.lang.Exception took 1000 milliseconds
demo.FoobarTest > shouldHaveSlept PASSED
demo.FoobarTest STANDARD_OUT
PlainTextActionReporterSUCCESSNo monitoring data to report.
demo.RestFoobarTest STANDARD_ERROR
Apr 17, 2014 5:54:50 PM org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer addServletWithDefaultConfiguration
INFO: Registering the Jersey servlet application, named javax.ws.rs.core.Application, with the following root resource and provider classes: [class demo.RestFoobar]
Apr 17, 2014 5:54:50 PM org.glassfish.jersey.server.ApplicationHandler initialize
INFO: Initiating Jersey application, version Jersey: 2.0 2013-05-03 14:50:15...
Apr 17, 2014 5:54:50 PM com.sun.enterprise.web.WebApplication start
INFO: Loading application [demo] at [/demo]
Apr 17, 2014 5:54:50 PM org.glassfish.deployment.admin.DeployCommand execute
INFO: demo was successfully deployed in 666 milliseconds.
demo.RestFoobarTest > getProfile STANDARD_ERROR
Apr 17, 2014 5:54:51 PM org.apache.catalina.core.StandardWrapperValve log
WARNING: StandardWrapperValve[javax.ws.rs.core.Application]: Servlet.service() for servlet javax.ws.rs.core.Application threw exception
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=Logger,parent=RestFoobar,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,998142827)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:771)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:790)
at org.glassfish.jersey.gf.cdi.CdiComponentProvider$1.inject(CdiComponentProvider.java:316)
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:158)
at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:716)
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:738)
at org.glassfish.jersey.gf.cdi.CdiComponentProvider$CdiFactory$1.getInstance(CdiComponentProvider.java:174)
at org.glassfish.jersey.gf.cdi.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:143)
at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:96)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:448)
at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:69)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2204)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:579)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:566)
at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172)
at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:185)
at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:105)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:118)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:102)
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:62)
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:215)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)
demo.RestFoobarTest > getProfile FAILED
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException at RestFoobarTest.java:32
demo.RestFoobarTest > getHello STANDARD_ERROR
Apr 17, 2014 5:54:51 PM org.apache.catalina.core.StandardWrapperValve log
WARNING: StandardWrapperValve[javax.ws.rs.core.Application]: Servlet.service() for servlet javax.ws.rs.core.Application threw exception
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=Logger,parent=RestFoobar,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,436148362)
at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)
at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:771)
at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:790)
at org.glassfish.jersey.gf.cdi.CdiComponentProvider$1.inject(CdiComponentProvider.java:316)
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:158)
at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:716)
at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:738)
at org.glassfish.jersey.gf.cdi.CdiComponentProvider$CdiFactory$1.getInstance(CdiComponentProvider.java:174)
at org.glassfish.jersey.gf.cdi.CdiComponentProvider$CdiFactory.provide(CdiComponentProvider.java:143)
at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:96)
at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:448)
at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:69)
at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2204)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:579)
at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:566)
at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172)
at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:185)
at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:105)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:118)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:121)
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:102)
at org.glassfish.jersey.server.internal.routing.RoutingStage.apply(RoutingStage.java:62)
at org.glassfish.jersey.process.internal.Stages.process(Stages.java:197)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:215)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:198)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:946)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:323)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:745)
demo.RestFoobarTest > getHello FAILED
org.junit.ComparisonFailure at RestFoobarTest.java:25
demo.RestFoobarTest STANDARD_OUT
PlainTextActionReporterSUCCESSNo monitoring data to report.
4 tests completed, 2 failed
As shown above, the #Profiled annotation works in Foobar, but causes problems in RestFoobar. If remove the #Profiled above RestFoobar.profile(), the test will pass, except there is no longer the profiling output.
BTW, I use Arquillian and embedded Glassfish to run the tests. Here is a full list of the dependencies:
dependencies {
providedCompile 'javax:javaee-api:7.0'
testCompile 'junit:junit:4.11'
testCompile 'org.jboss.arquillian:arquillian-bom:1.1.4.Final'
testCompile 'org.jboss.arquillian.junit:arquillian-junit-container:1.1.4.Final'
testRuntime 'org.glassfish.main.extras:glassfish-embedded-all:4.0'
testRuntime 'org.jboss.arquillian.container:arquillian-glassfish-embedded-3.1:1.0.0.CR4'
}
The Arquillian war wrapper is as follows
ArquillianWarBase
public abstract class ArquillianWarBase {
private static WebArchive war;
#Deployment
public static WebArchive createDeployment() {
if( war == null ) {
war = ShrinkWrap.create( WebArchive.class, "demo.war" )
.addPackages( true, Filters.exclude( ".*Test.*" ),
"demo" )
.addAsWebInfResource( "beans-test.xml", "beans.xml" )
.addAsWebInfResource( "glassfish-web-test.xml", "glassfish-web.xml" )
.addAsWebInfResource( "web-test.xml", "web.xml" );
System.out.println( war.toString( true ) );
}
return war;
}
}
So, it looks like the interceptor annotation #Profiled doesn't work inside a jax-rs resource class (i.e., RestFoobar). But why? Is there a simple way to make it work?
Thank you very much.
So, it looks like the interceptor annotation #Profiled doesn't work
inside a jax-rs resource class (i.e., RestFoobar). But why?
Because your class (i.e RestFooBar) is not a CDI-managed-bean. Interceptors only work with this sort of beans.
Is there a simple way to make it work?
Yes, annotate your class (i.e RestFooBar) with #Stateless from the javax.ejb package, this will also give you the opportunity to inject other services with #EJB.
There are some other options:
Separate your service and REST classes in such a way that only the service classes need to be intercepted.
There seems to be a module named jersey-gf-cdi which implemtens a bridge between Glassfish CDI and Jersey, but I didn't get that to work and I'm not sure if this is a solution for the problem.
See also:
CDI interceptor injected into a jersey RS service(resource) not working?
Package org.glassfish.jersey.gf.cdi.spi
Package org.glassfish.jersey.gf.cdi.hk2ban
I've been using the following guide to develop a hello world REST web service.
The guide can be found at: http://wiki.eclipse.org/Creating_a_JAX-RS_Web_Service
I'm trying to open the path: "http://localhost:8080/BeezerServer/jaxrs/addresses"
but it keeps on saying that "The requested resource (/BeezerServer/jaxrs/addresses) is not available."
my web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web- app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>BeezerServer</display-name>
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.apache.wink.server.internal.servlet.RestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.AddressBookApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
</web-app>
The project looks as following(in case it might help someone):
The tomcat log:
Aug 31, 2012 7:48:58 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program...
Aug 31, 2012 7:48:59 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Aug 31, 2012 7:48:59 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Aug 31, 2012 7:48:59 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1536 ms
Aug 31, 2012 7:48:59 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Aug 31, 2012 7:48:59 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.29
Aug 31, 2012 7:48:59 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Aug 31, 2012 7:48:59 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Aug 31, 2012 7:48:59 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 737 ms
AddressBookApplication.java:
package com.test;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class AddressBookApplication extends Application {
#Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(AddressBook.class);
return classes;
}
}
AddressBook.java:
package com.test;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
/**
* A sample resource that provides access to
* server configuration properties
*/
#Path(value="/addresses")
public class AddressBook {
public AddressBook() {
System.out.println();
}
private static String[] list = new String[] {
"Eric- 932 Deloraine Av.",
"Yen - 687 Markham Rd.",
"Keith - 4301 McCowan Rd.",
"Ron - 465 Melrose St.",
"Jane - 35 Cranbrooke Av.",
"Sam - 146 Brooke Av."
};
#GET
#Produces(value="text/plain")
public String getList() {
StringBuffer buffer = new StringBuffer();
buffer.append("{");
for (int i = 0; i < list.length; ++i) {
if (i != 0)
buffer.append(", ");
buffer.append(list[i]);
}
buffer.append("}");
return buffer.toString();
}
#GET
#Produces(value="text/plain")
#Path(value="{id}")
public String getPropety(#PathParam("id") int id) {
if (id > -1 && id < list.length -1) {
return list[id];
}
else {
return "Name Not Found";
}
}
#GET
#Produces(value="text/html")
#Path(value="html")
public String getHTMLList()
{
return "<html><body><p><b>Hello</b></body></html>";
}
#POST
#Produces(value="text/html")
#Path(value="form")
public String handlePost(#PathParam("name") String name,#PathParam("age") int age)
{
return "<html><body><p>name: " + name + "<p>age: " + age;
}
}