Spring-shell usage - spring-shell

I'm trying to use spring-shell.
Created such class:
#Component
public class T implements CommandMarker {
public T() {
System.out.println("T Constructor");
}
#CliCommand(value = "trans", help = "translate")
public String translate(#CliOption(key = { "msg" },
mandatory = false, help = "The hello world message")
final String msg) {
System.out.println("!!! " + msg);
return "!!! " + msg;
}
}
and have such spring-shell-plugin.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="com" />
</beans>
Class that starting application:
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath*:/META-INF/spring/spring-shell-plugin.xml");
context.start();
}
}
But as a result I'm just getting in console only 'T Constructor' althought I'm passing arguments 'trans --msg f'.
How to make it works?

public static void main(String[] args) throws IOException {
Bootstrap.main(args);
}

Related

Spring mvc MappingSqlQuery Property 'sql' is required

I work with Netbeans, Spring MVC and Oracle.
I want to use MappingSqlQuery to execute oracle sql. This is the java class which implements MappingSqlQuery
public class SelectAllDepartamentos extends MappingSqlQuery<Departamento> {
private static final String SQL_SELECT_DEPT =
"SELECT DEPT_NO, DNOMBRE, LOC FROM DEPT";
public SelectAllDepartamentos() {
}
public SelectAllDepartamentos(DataSource dataSource) {
super(dataSource,SQL_SELECT_DEPT);
}
#Override
protected Departamento mapRow(ResultSet rs, int i) throws SQLException {
Departamento dept = new Departamento();
dept.setNumero(rs.getInt("DEPT_NO"));
dept.setNombre(rs.getString("DNOMBRE"));
dept.setLocalidad(rs.getString("LOC"));
return dept;
}
}
The class which use SelectAllDepartamentos is . The method that I use is findAll
public class JdbcDepartamentoDao1 implements InitializingBean,DepartamentoDao{
private javax.sql.DataSource dataSource;
private JdbcTemplate jdbcTemplate;
private SelectAllDepartamentos selectdepartamentos;
public JdbcDepartamentoDao1() {
}
public JdbcDepartamentoDao1(javax.sql.DataSource dataSource) {
this.dataSource = dataSource;
}
public void setDataSource(javax.sql.DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.selectdepartamentos = new SelectAllDepartamentos();
}
#Override
public List<Departamento> findAll() {
return this.selectdepartamentos.execute();
}
#Override
public List<Departamento> findByLocalidad(String localidad) {
return null;
}
#Override
public String findById(int iddepartamento) {
String nombre = jdbcTemplate.queryForObject("SELECT DNOMBRE from DEPT WHERE DEPT_NO = ?",
new Object[]{iddepartamento},String.class);
return nombre;
}
#Override
public void insertarDepartamento(Departamento departamento) {
}
#Override
public void modificarDepartamento(Departamento departamento) {
}
#Override
public void eliminarDepartamento(Departamento departamento) {
}
#Override
public void afterPropertiesSet() throws Exception {
if (dataSource == null){
throw new BeanCreationException("Debe establece el dataSource ContactDao");
}
}
}
My application-context.xml is
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?xml version="1.0" encoding="UTF-8"?> -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="departamentoDao" class="dao.JdbcDepartamentoDao1">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->
<bean id="selectAllDepartamentos" class="modelos.SelectAllDepartamentos">
<property name="dataSource" ref="dataSource"></property>
<constructor-arg type="DataSource" ref="dataSource"></constructor-arg>
</bean>
</beans>
When I executed the method findAll
#Override
public List<Departamento> findAll() {
return this.selectdepartamentos.execute();
}
I get the error
Remove
/*public void setDataSource(javax.sql.DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.selectdepartamentos = new SelectAllDepartamentos();
}*/
Change to arg
<bean id="departamentoDao" class="dao.JdbcDepartamentoDao1">
<constructor-arg ref="dataSource" />
</bean>
Update constructor
public JdbcDepartamentoDao1(javax.sql.DataSource dataSource) {
this.dataSource = dataSource;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.selectdepartamentos = new SelectAllDepartamentos();
}

while running robotium error messge has been displayed "does not have a signature matching the target com.android.calculator2"

Here is my code
package com.test.android.calculator2;
import android.app.Activity;
import com.robotium.solo.Solo;
import android.test.ActivityInstrumentationTestCase2;
#SuppressWarnings("unchecked")
public class TestApk extends ActivityInstrumentationTestCase2 {
private static final String TARGET_PACKAGE_ID="com.android.calculator2";
private static final String
LAUNCHER_ACTIVITY_FULL_CLASSNAME="com.android.calculator2.Calculator";
private static Class <?> launcherActivityClass;
static {
try {
Activity act = new Activity();
launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
// #SuppressWarnings("unchecked")
public TestApk()throws ClassNotFoundException {
super(TARGET_PACKAGE_ID,launcherActivityClass);
}
private Solo solo;
#Override
protected void setUp() throws Exception {
solo = new Solo(getInstrumentation());
}
public void testCanOpenSettings() {
solo.getActivityMonitor();
getActivity();
solo.sendKey(Solo.DOWN);
solo.goBack();
}
#Override
public void tearDown() throws Exception {
try {
solo.finalize();
} catch (Throwable e) {
e.printStackTrace();
}
getActivity().finish();
super.tearDown();
}
}
Manifest file like this
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.android.calculator2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="19" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.android.calculator2" />
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name" >
<uses-library android:name="android.test.runner" />
</application>
</manifest>
It looks like your defined target package com.android.calculator2 could not be found.
I see that the class you posted is located in the package com.test.android.calculator2
You either have to create a new package com.android.calculator2 or set your target package to a existing package (e.g. com.test.android.calculator2).

spring-boot RedisTemplate<String,User> exception

My code like this:
Java:
#Autowired
private RedisTemplate<String,User> myTemplate;
#Override
public String login(String email, String password) {
User user = this.userRepository.findByEmailAndPassword(email, password);
System.out.println(user);
if (user == null) return null;
String key1 = "lic" + "$" + user.getId() + "$" + user.getRole() + "$" + user.getName() + "$" + user.getEmail();
ValueOperations<String, User> ops = this.myTemplate.opsForValue();
if (!this.myTemplate.hasKey(key1)) {
ops.set(key1, user);
}
return key1;
}
when app run, inject bean ,like this:
#SpringBootApplication
public class ApplicationApp extends WebMvcConfigurerAdapter {
// #Autowired
// private RedisTemplate<String,String> template;
#Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory();
}
#Bean
RedisTemplate<String, User> redisTemplate() {
final RedisTemplate<String, User> template = new RedisTemplate<String, User>();
template.setConnectionFactory(jedisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericToStringSerializer<User>(User.class));
template.setValueSerializer(new GenericToStringSerializer<User>(User.class));
return template;
}
#Override
public void addInterceptors(InterceptorRegistry registry) {
// super.addInterceptors(registry);
registry.addInterceptor(new AuthorAccess()).addPathPatterns("/api/sc/**");
}
public static void main(String[] args) throws Exception {
SpringApplication.run(ApplicationApp.class, args);
}
}
then , call login service found error like this:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type com.qycloud.oatos.license.domain.User to type java.lang.String
Set ValueSerializer with Jackson2JsonRedisSerializer instead of GenericToStringSerializer and it should work. GenericToStringSerializer do not support Object to String conversion.
template.setValueSerializer(new Jackson2JsonRedisSerializer<User>(User.class));
You need to register you're own implementation of TypeConverter or a ConversionService able to deal with User.class via eg. setTypeConverter(TypeConverter converter). Otherwise GenericToStringSerializer will just try using the DefaultConversionService which does not know about your type.

How to merge records together

i am able to update the database so for each section a user saves it saves there work fine, in the correct column of the database, but what i am now trying to achieve is instead of saving into a new row, check there studentNumber and if it already has a record in the table (which it will have to to get this far ) update the columns to that record rather than starting a new one
how can i do that ?
currently this is my code :
this is the u.i. where they select the value and press submit
<p:spinner id="ajaxspinner80-100" value="#{editMarkingBean.markSectionTwo.markSectionTwo}"
stepFactor="1" min="80" max="100" disabled="#{formBean.number != 8}">
<p:ajax update="ajaxspinnervalue" process="#this" />
</p:spinner>
the save button
<p:commandButton action="#{editMarkingBean.markSectionTwo}" value="#{bundle.buttonSave}" update=":growl" icon="ui-icon-disk"/>
the backing bean is :
#Named(value = "editMarkingBean")
#ViewScoped
public class EditMarkingController {
private String searchString;
private String ordering;
private String criteria;
private String match;
private Date today;
private String caseMatch;
private int spinnerField;
private Marking markSectionOne;
private Marking studentNumber;
private Marking markSectionTwo;
private MarkingService markingService;
private Marking markToEdit;
#Inject
private MarkingFacade markingFacade;
#PostConstruct
public void init() {
//this.markToEdit = this.markingFacade.find(studentNumber);
this.markSectionTwo = new Marking();
}
public String markSectionTwo() {
this.markingFacade.edit(markSectionTwo);
this.setMessage("Mark Saved");
markSectionTwo = new Marking();
this.setMessage("Mark Saved");
// now navigating to the next page
return "/lecturer/marking/marking-section-three";
}
private void setMessage(String message) {
FacesContext fc = FacesContext.getCurrentInstance();
fc.addMessage(null, new FacesMessage(message, ""));
}
public Marking getMarkSectionTwo() {
return markSectionTwo;
}
public void setMarkSectionTwo(Marking markSectionTwo) {
this.markSectionTwo = markSectionTwo;
}
public String getSearchString() {
return searchString;
}
public void setSearchString(String searchString) {
this.searchString = searchString;
}
public String getOrdering() {
return ordering;
}
public void setOrdering(String ordering) {
this.ordering = ordering;
}
public String getCriteria() {
return criteria;
}
public void setCriteria(String criteria) {
this.criteria = criteria;
}
public String getMatch() {
return match;
}
public void setMatch(String match) {
this.match = match;
}
public Date getToday() {
return today;
}
public void setToday(Date today) {
this.today = today;
}
public String getCaseMatch() {
return caseMatch;
}
public void setCaseMatch(String caseMatch) {
this.caseMatch = caseMatch;
}
public int getSpinnerField() {
return spinnerField;
}
public void setSpinnerField(int spinnerField) {
this.spinnerField = spinnerField;
}
public Marking getMarkSectionOne() {
return markSectionOne;
}
public void setMarkSectionOne(Marking markSectionOne) {
this.markSectionOne = markSectionOne;
}
public Marking getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(Marking studentNumber) {
this.studentNumber = studentNumber;
}
public MarkingService getMarkingService() {
return markingService;
}
public void setMarkingService(MarkingService markingService) {
this.markingService = markingService;
}
public MarkingFacade getMarkingFacade() {
return markingFacade;
}
public void setMarkingFacade(MarkingFacade markingFacade) {
this.markingFacade = markingFacade;
}
}
but currently only adds a new row with the data to the database rather than trying to merge it with the data already contained in the database for a student with a certain student number
how can i achieve this ? thanks guys for your help :)
EDIT :
I have tried :
private Marking markToEdit;
#Inject
private MarkingFacade markingFacade;
#PostConstruct
public void init() {
this.markToEdit = this.markingFacade.find(studentNumber);
//this.markSectionTwo = new Marking();
}
public String markSectionTwo() {
this.markingFacade.edit(markSectionTwo);
this.setMessage("Mark Saved");
// markSectionTwo = new Marking();
//this.setMessage("Mark Saved");
// now navigating to the next page
return "/lecturer/marking/marking-section-three";
}
but get the error :
exception
javax.servlet.ServletException: WELD-000049 Unable to invoke public void sws.control.EditMarkingController.init() on sws.control.EditMarkingController#4109691f
root cause
org.jboss.weld.exceptions.WeldException: WELD-000049 Unable to invoke public void sws.control.EditMarkingController.init() on sws.control.EditMarkingController#4109691f
root cause
java.lang.reflect.InvocationTargetException
root cause
javax.ejb.EJBException
root cause
java.lang.IllegalArgumentException: An instance of a null PK has been incorrectly provided for this find operation.
I use a quite similar approach as yours, but with different names. I'll post it here, so I think you can have some idea.
My way is to check the entity explicitly before merging it.
My JSF CRUD looks like this
xhtml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>DataSource Manager</title>
</h:head>
<h:body>
<h:form id="ds">
<p:spacer height="10" />
<p:fieldset legend="Insert/Edit Data Source">
<p:panel id="insertUpdateForm">
<h:panelGrid columns="2">
<p:outputLabel for="name" value="Data Source Name:" style="width:100px;"/>
<p:inputText id="name" value="#{dataSourceMB.dataSource.name}"/>
<p:outputLabel for="user" value="User:" style="width:100px;"/>
<p:inputText id="user" value="#{dataSourceMB.dataSource.user}"/>
<p:outputLabel for="driver" value="Driver:" style="width:100px;"/>
<p:inputText id="driver" value="#{dataSourceMB.dataSource.driver}" />
</h:panelGrid>
</p:panel>
<p:panel>
<p:commandButton value="Save" action="#{dataSourceMB.saveDataSource}" update="dsList,insertUpdateForm" />
<p:commandButton value="Clear" action="#{dataSourceMB.clearDataSource}" update="insertUpdateForm" />
<p:commandButton value="Test Connection" action="#{dataSourceMB.testConnection}"/>
</p:panel>
</p:fieldset>
<p:spacer height="10" />
<p:fieldset legend="Data Sources">
<p:panel>
<p:dataTable
var="ds"
value="#{dataSourceMB.listDataSources}"
paginator="true" rows="10"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
rowsPerPageTemplate="10,50,100"
id="dsList">
<p:column headerText="ID">
<h:outputText value="#{ds.id}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{ds.name}" />
</p:column>
<p:column headerText="JDBC">
<h:outputText value="#{ds.jdbc} " />
</p:column>
<!-- check http://jqueryui.com/themeroller/ for icons -->
<p:column headerText="" style="width:2%">
<p:commandButton icon="ui-icon-pencil" action="#{dataSourceMB.editDataSource}" title="Edit" update=":ds:insertUpdateForm">
<f:setPropertyActionListener value="#{ds}" target="#{dataSourceMB.selectedDataSource}" />
</p:commandButton>
</p:column>
<p:column headerText="" style="width:2%">
<p:commandButton icon="ui-icon-trash" action="#{dataSourceMB.removeDataSource}" title="Remove" update=":ds:insertUpdateForm,dsList">
<f:setPropertyActionListener value="#{ds}" target="#{dataSourceMB.selectedDataSource}" />
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
</p:fieldset>
</h:form>
</h:body>
</html>
my managed bean
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.apache.log4j.Logger;
import DataSourceEJB;
import JSFUtilEJB;
import DataSource;
#ManagedBean
#ViewScoped
public class DataSourceMB implements Serializable {
private static final long serialVersionUID = 871363306742707990L;
private static Logger log = Logger.getLogger(DataSourceMB.class);
#EJB
private JSFUtilEJB jsfUtilEJB;
#EJB
private DataSourceEJB dataSourceEJB;
private DataSource dataSource;
private DataSource selectedDataSource;
private List<DataSource> listDataSources;
#PostConstruct
public void init() {
try {
this.dataSource = new DataSource();
this.listDataSources = this.dataSourceEJB.listDataSources();
} catch (Exception e) {
jsfUtilEJB.addErrorMessage(e,"Could not list");
}
}
public void removeDataSource(){
try {
this.dataSourceEJB.removeDataSource(this.selectedDataSource);
jsfUtilEJB.addInfoMessage("Removed "+this.selectedDataSource.getName());
if (this.dataSource != null && this.dataSource.getId() != null && this.dataSource.getId().equals(this.selectedDataSource.getId())){
this.dataSource = null;
}
this.listDataSources = this.dataSourceEJB.listDataSources();
} catch (Exception e) {
jsfUtilEJB.addErrorMessage(e,"Could not remove");
}
}
public void saveDataSource(){
try {
this.dataSourceEJB.saveDataSource(this.dataSource);
jsfUtilEJB.addInfoMessage("Saved "+this.dataSource.getName());
this.dataSource = new DataSource();
this.listDataSources = this.dataSourceEJB.listDataSources();
} catch (Exception e) {
jsfUtilEJB.addErrorMessage(e,"Could not save");
}
}
public void editDataSource(){
this.dataSource = this.selectedDataSource;
}
public void clearDataSource(){
this.dataSource = new DataSource();
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getSelectedDataSource() {
return selectedDataSource;
}
public void setSelectedDataSource(DataSource selectedDataSource) {
this.selectedDataSource = selectedDataSource;
}
public List<DataSource> getListDataSources() {
return listDataSources;
}
public void setListDataSources(List<DataSource> listDataSources) {
this.listDataSources = listDataSources;
}
}
my EJB
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.ejb.Stateless;
import javax.inject.Inject;
import DataSource;
#Stateless
public class DataSourceEJB {
#Inject
private BaseService baseService;
public List<DataSource> listDataSources() {
return this.baseService.getDataSourceDAO().getAll();
}
public void removeDataSource(DataSource ds) throws Exception {
DataSource a = this.baseService.getDataSourceDAO().find(ds.getId());
this.baseService.getDataSourceDAO().delete(a);
}
public void saveDataSource(DataSource ds) throws Exception {
DataSource a = this.baseService.getDataSourceDAO().find(ds.getId());
if (a == null){
this.baseService.getDataSourceDAO().add(ds);
}else{
this.baseService.getDataSourceDAO().edit(ds);
}
}
public DataSource getById(long id) {
return this.baseService.getDataSourceDAO().find(id);
}
public DataSource getByName(String name) {
return this.baseService.getDataSourceDAO().findByName(name);
}
}
DAO
public E find(Long id) {
return (E)entityManager.find(clazz, id);
}
public void add(E entity) throws Exception {
entityManager.persist(entity);
}
public E edit(E entity) throws Exception {
return entityManager.merge(entity);
}
public void delete(E entity) throws Exception {
entityManager.remove(entity);
}

Can't get Form Validation working

I was learning Struts 1.1 and trying to do some form validation with my code.
But the errors that I had described in the MessageResources.properties file do not get displayed on the JSP. I tried a lot of options but couldn't get it off the ground. I have attached some of the code.
MessageResources.properties
error.name.required = Please mention your name.
error.email.incorrect = You E-Mail ID is Incorrect.
error.phone.numericError = Phone number should consist only of digits.
error.phone.lengthIncorrect = Phone number should be only of 10 digits.
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="detailsForm" type="com.example.form.DetailsForm"/>
</form-beans>
<action-mappings>
<action input="/detailsEntry.jsp" name="detailsForm" path="/DetailsForm" type="com.example.action.DetailsAction" validate="true">
<forward name="success" path="/displayDetails.jsp"/>
<forward name="failure" path="/failure.jsp"/>
</action>
</action-mappings>
</struts-config>
Form Class:
package com.example.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
public class DetailsForm extends ActionForm {
private String name;
private String email;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
#Override
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.name = null;
this.email = null;
this.phone = null;
}
#Override
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
ActionErrors actionErrors = new ActionErrors();
if (this.name.equals(null) || this.name.length() == 0) {
actionErrors.add("name", new ActionError("error.name.required"));
}
return actionErrors;
}
private boolean isNumeric(String phoneNumber) {
try {
Integer.parseInt(phoneNumber);
return true;
}
catch (NumberFormatException numberFormatException) {
return false;
}
}
}
The default resource filename is ApplicationResources.properties.
Using a different (or multiple) resource files requires configuration in struts-config.xml:
<message-resource parameter="MessageResources" null="false" />
Don't forget to add the following to your jsp:
<html:errors />
Your error messages will appear where ever you put this tag on on your jsp.
And if you want your error message to be displayed next to the field they relates to then use the following:
<html:errors property="custName" />
where "custName" is the name you gave the error message when you created it in your form ex:
ActionMessages errors = new ActionMessages();
errors.add("custName", new ActionMessage("custName.invalid"));
request.setAttribute(Globals.ERROR_KEY, errors);