Wednesday, October 7, 2015

Enabling Spring context to HttpServlet using SpringBeanAutowiringSupport


I recently had this requirement where i had to enable Spring context to an HttpSevlet.

So this is how is started with

web.xml


<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
         classpath*:/spring-bootstrap.xml
   classpath*:/spring-service.xml
        </param-value>
    </context-param> 

   <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener> 

    
    <servlet>
        <servlet-name>proxy</servlet-name>
        <servlet-class>com.proxy.servlet.HttpProxyServlet</servlet-class>
       <!--  <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param> -->
         
         <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>proxy</servlet-name>
        <url-pattern>/api/proxy/*</url-pattern>
    </servlet-mapping>


spring-bootstrap.xml


 <beans profile="custom">
        <!-- Can't use context:property-placeholder until Spring bug SPR-7765 is addressed -->
         <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer" 
              p:location="file:#{systemProperties['app.conf']}" /> 
        <!-- <context:property-placeholder location="classpath:/app.conf" />   -->    
    </beans>

Note i am using spring profile to load properties to the application context

Now, in my ProxyServlet , i want to load values from the properties , so this is what I did


1
2
3
4
5
@Value("${REALM_ID:}")
private String ENV_REALM_ID;
     
@Value("${service_base_url:}")
private String ENV_SERVICE_BASE_URL;

But as it turns out that the servlet did not load the values. By default the spring dependencies are not injected. So to do that i had to add the following

1
2
3
4
5
6
7
@Override
public void init(ServletConfig servletConfig) throws ServletException {

super.init(servletConfig);
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

}

Another way of doing this is

1
applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());

The following post was useful in solving the prob

how-to-mage-java-servlet-managed-or-di-in-spring

Monday, March 30, 2015

java.lang.SecurityException: Unsupported keysize or algorithm or java.security.InvalidKeyException: Illegal key size


I have faced this issue when working with the Bouncy Castle Provider and the reason for that is the JCE files are not updated in the JVM. To fix it, one needs to download the JCE unrestricted policy files from oracle site, e.g download and copy the local_policy.jar and the US_export_policy.jar to jre/lib/security. This fixes the issue

Got the solution from the Frequently asked questions for Bouncy Castle, here