How to use spring mvc controllers without component-scanning? - google-app-engine

I use Spring 3.x MVC #Controller annotations. My servlet.xml has this entry:
<context:component-scan base-package=”com.my.controllers.package”/>
My webapp, on Google's app engine has to initialize & startup within 60secs. Mine takes longer due to this classpath scanning (This link explains the importance of "Reducing or Avoiding the Use of Component Scanning" in app engine).
I added the following line to my servlet.xml
<bean id=”myComponentBean” class=”org.foo.MyComponent”/>
Now, regardless of whether I add #Controller or not, the controller does not get loaded. Any url results in 404.
Questions:
1) So how do I make a spring 3.x MVC controller behave as a web controller without relying on the comonent scanning?
2) When I filed a bug with google, I was asked to remove the "component scanning" & to "explicitly define the classes needed using classLoader.getResource()". How can I use classLoader.getResource() to load mvc controllers?
P.S: Classpath scanning on app engine has known issues. Discussing that will be a digression here. So I skipped the details.

you are already doing it right. define your controllers with <bean class="..." /> and put <mvc:annotation-driven /> in your servlet configuration. that is it!
UPDATE:
and you may need <context:annotation-config /> as well for some annotations(#EJB, #PersistenceContext, etc.) to get handled by spring.

Related

Spring MVC with AngularJS for presentation (is REST necessary ?)

I plan to use Spring MVC for a JEE application and i'm still debating whether to use AngularJS or PrimeFaces for presentation. My question is :
I've done some research concerning AngularJS with Spring MVC and i have found pretty much everyone talking about using REST API in Spring to make the connection with AngularJS pages(?). Is that the only way to use these two technologies together ?
In order to make the spring controller/methods to be used as REST API, all you need to do is, annotate the controller with #RestController annotation.
Also in order to make the Java object to JSON and vice versa you can use Jackson API. Adding this snippet in your XML file and relevant dependency/jar in project will help you transfer data back and forth easily.
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
No, not necessary. Your angular frontend will be expecting JSON data to render. As far as you can call your service be it any api and it (api) can return JSON it is good.
but rest is a preferred option for using angular as it is simpler to be configured.

How to make an existing AngularJS SPA plugable to other projects

I have an AngularJS app (myApp) currently used only by my own ASP.NET MVC app. The AngularJS is working well in my app. Now other MVC apps also want this as an add-on (plugin). Is this possible to do without modifying my original AngularJS app, and been too intrusive to other apps?
I thought is like this:
distribute the myApp.js to an in-house CDN to be included the BundleConfig.cs by other apps
add a <DIV data-ng-app="myApp"> in pages of other apps so that my original AngularJS can be injected.
Far too many unknowns about how your app is configured for a precise answer but any module can be dependency injected into another module.
For simplicity sake assume that you have all the templates needed to run your app converted to javascript strings and use $templateCache() to register them and all the code for your app is in one file then anyone would be able to inject your module into theirs and use whatever components you have available.
All they would need would be a script tag that points at location for your app file ... and that location could be any server, cdn or local download directory

Thinktecture IdentityServer V3 - Data is not binding and resources are not loading

I've recently created an Web API that I'd like secured by Thinktecture's IdentityServer V3. I imported the package from nuget, and was able to hit the token endpoints to create a token. However, I noticed that the bootstrap css would not load on IS's main page:
This is how it appears i.imgur.com/DftMQ7C.png vs https:/demo.getidentityserver.com
It didn't bother me until I started using the views (and not just the endpoints) where my pages would print the variable names and function incorrectly with the resources not loading properly. Like so.
Of course, I can not log in since it redirects me the literal "loginUrl" page. I've tried reverting to the previous version 1.2.1, but I still have the same issue. Alternatively, I've looked at samples and those don't have the same issue at all, so I'm wondering if there's a config in my API project that may be causing this.
Has anyone encountered this problem or know of a potential fix?
Be sure to read through the documentation thoroughly, guys. Lesson learned. I just needed to add RAMMFAR to my web.config "otherwise some of the embedded assets will not be loaded correctly by IIS"
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

Can AngularJS work in Java EE MVC Architecture : JSP->Servlet->EJB3.1->Business Object->DAO

I have a quick question on considering AngularJS (current stable version - 1.3.9) for an upcoming application that we are building on an existing framework. The current framework has a Java EE MVC architecture and here are the current components mentioned in sequential order in which they get invoked:
View - JSPs: This layer gets as response Java Objects and we use jsp:useBean to access its properties and display on screen.
If any modifications are done on the page, it goes through a ControllerServlet i.e a Java file which has code to access the HttpRequest and HttpSession related information. The controller also does a lookup in JNDI to find the name of the bean to invoke based on the HttpRequest parameter name, e.g. PageId
Once the EJBBean lookup is returned, the controller invokes an EJB 3.1 "no-interview" view - These are Stateless Beans annotated with #Stateless
EJBBean classes then invoke BusinessObject classes, we call them "BO" which internally gets referenced by the DAO interface
A DAO implementation class is the one which is responsible for CRUD operations
Our Problems as of now:
The view is tightly coupled to Java Objects that are returned from DAOs and since the response is not converted to JSON, a lot of scriptlet code is used to display their value (I know scriplets are oldskool, but being a legacy solution there is no choice)
jQuery is used to manipulate the DOM before sending it to the controller layer
View is not the official record of whats happening on the screen, unlike AngularJS where I could easily understand
Developers write custom CSS for different browsers manually
Proposed Solution
View shall be designed for the new application using AngularJS
Take advantage of Bootstrap css classes which has readily available CSS which can be combined with AngularJS
Each request goes to ControllerServlet using $http service to ensure we use existing MVC architecture i.e routing every request through Controller
EJB Layer to be RESTFul to return data in JSON Format
Viewport specific css code for responsive web design - i.e same screen should render on multiple devices and platforms
Questions:
Is the proposed solution feasible? What are the downsides?
Is it a good practice to reference EJB Bean classes as RESTFul services?
Do we get access to all the Java EE objects / interfaces using AngularJS? For e.g. HttpRequest, HttpSession, etc.
Will it help in performing better by switching to this architecture?
Question from Management - Why not stick with jQuery! - Probably the hardest of all the questions to convince the management of Angular's benefits
Hope you guys can help throw some suggestions
i'm using spring 4.0.1 , hibernate 4.3.5 ,jackson 1.9.2 , I'm creating a RESTful webservice that returns a data in JSON format and angularjs in front-end which is loosely coupled with back-end.
concerning your questions;
the solution is feasible of course , until now there no downsides
except session management is tricky because Restful ws is stateless
.
it's provide a very elegant feature that you can access all your
functionality via any application web-client-side, desktop or
mobile.
angular app is fully isolated from back-end app you can maintain
requests and session in the server and respond with what you like in
json format to angular
same as 2
i hope it's helpful

EntryPoint Classes & Modules in GWT

GWT code structure is really getting hard for me to follow :(.
As per my understandings,
Modules references Entry Point classes.
When a module is loaded entry point classes referenced on it get initiated, and onModuleLoad() of corresponding classes will get executed
HTML host pages need to include a nocache.js file (only if it needs to work with entry point classes)
If my understandings are correct,
In standard web development platforms like asp .net an aspx page refer to a servlet. Here mulitple html pages can refer to a single entry point class.Why?(and this is much complicated?)
When I can expect a module to load? If multiple modules & html pages are there, how we can assign modules to html pages, so that a particular module will load when user requests an html page?
I have an Async service call implemented at onModuleLoad(). And want to call this only for index.html page. But How can I identify the html page at onModuleLoad()?
Why Google proposes GWT for GAE app development?
I am newbie in GWT. I want to follow a good programmig structure for GAE app development. Corrections and suggestions are expecting...
Pls see this to understand how a GWT project is organized: https://developers.google.com/web-toolkit/doc/latest/DevGuideOrganizingProjects
(Bootstrap is also described there, how application loads from the html page)
I think the main thing is that everything compiles to one javascript file.
The app runs in a single page.
In .gwt.xml you define the entry-point of your app.
Also you specify what other modules you inherit.
This is very similar to java or .net applications where you specify what other packages you need. The modules are like libraries. For example if you needed to use JSON you would inherit the json module. Also I don't think to you are obliged to use GWT on the front

Resources