Spring formatter

Fórumok

Van két fő entitásom, Question és Topic. a JSP oldalon a kérdés mellé válaszható egy Toic legördülő listából (one-many). Ezeket próbáltam:
http://ankeetmaini.wordpress.com/2012/08/01/binding-nested-objects-comp… and this: http://springinpractice.com/2012/01/07/making-formselect-work-nicely-us…

amikor a jsp megjelenik, kiírja a topic-ok id-it, tehát a formatter print-je lefut, de fordítva, a parse az nem. Van ötletetk miért lehet? köszi


@Entity     
public class Question {
        @Id
        @Column(nullable = false)
        //@GeneratedValue
        private Integer qid;
        @Column(nullable = false, length = 2000)
        private String question;
        @ManyToOne
        @JoinColumn(name = "TID_FK")
        private Topic topic;
...

@Entity
public class Topic {
    @Id
    @Column(nullable = false)
    private Integer tid;
    @Column(nullable = false, length = 200)
    private String topicname;
    @OneToMany(mappedBy = "topic")
    private List[Question] questionList;
...

@Controller
@RequestMapping("/client")
public class QuestionController {
    @Autowired
    private QuestionBo questionBo;
    @Autowired
    private TopicBo topicBo;
    @Autowired
    private LoginBo loginBo;

    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView listContacts(Map[String, Object] map) {
        map.put("question", new Question());
        map.put("topicList", topicBo.listTopics());
        map.put("questionList", questionBo.listQuestions());
        return new ModelAndView("client", "command", new barii.model.Question());
    }

    @RequestMapping(method = RequestMethod.POST)
    public String addContact(@ModelAttribute("command") @Valid Question question, BindingResult result, Model model) {
        question.setQid(100);
        question.setClient(loginBo.getUser().getClient());
            System.out.println("SAVE: "+question.toString());
            System.out.println("SAVE: "+question.getTopic().getTopicname());

        questionBo.addQuestion(question);

        return "redirect:/client";
    }
...

    @Component
    public class TopicFormatter implements Formatter[Topic] {
       @Autowired
       private TopicBo topicBo;

       @Override
       public String print(Topic topic, Locale arg1) {
           System.out.println("???"+topic.getTid().toString());  
           return topic.getTid().toString();
       }

       @Override
       public Topic parse(String tid, Locale arg1) throws ParseException {
           System.out.println("!!!!!!!!!"+topicBo.getTopic(tid).toString());  
           return topicBo.getTopic(tid);
       }


    }
...

[form:form method="POST"]
                    [!--  form:errors path="userName" style="color:Red; list-style:none; padding:0"/--]
                    [p]Topic:[/p]
                    [p]
                        [form:select path="topic"]
                            [form:option value="" label="-- Valassz --" /]
                            [form:options items="${topicList}" itemValue="tid" itemLabel="topicname"/]
                        [/form:select]
                        [form:errors path="topic"]
                            [span class="help-inline"][form:errors path="topic" /][/span]
                        [/form:errors]
                    [/p]
                    [p]New question:[/p]
                    [p]
                        [form:textarea path="question" id="txaNewQuestion" cols="60" rows="10" /]
                    [/p]
                    [p]
                        [input type="submit" styleClass="ui-button ui-widget ui-state-default ui-corner-all" /]
                    [/p]
                [/form:form]
....

[beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" ]

    [mvc:annotation-driven conversion-service="conversionService"/]


    [bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" ]
        [property name="prefix" ]
            [value]/WEB-INF/views/[/value]
        [/property]

        [property name="suffix" ]
            [value].jsp[/value]
        [/property]
    [/bean]

    [bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" ]
        [property name="driverClassName" value="${database.driver}" /]
        [property name="url" value="${database.url}" /]
        [property name="username" value="${database.user}" /]
        [property name="password" value="${database.password}" /]
    [/bean]


    [bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" ]
        [property name="dataSource" ref="dataSource" /]
        [property name="annotatedClasses" ]
            
    [value]barii.model.Users[/value] [value]barii.model.Client[/value] [value]barii.model.Genius[/value] [value]barii.model.Question[/value] [value]barii.model.Answer[/value] [value]barii.model.Topic[/value]
[/property] [property name="hibernateProperties" ] [props] [prop key="hibernate.dialect" ]${hibernate.dialect}[/prop] [prop key="hibernate.show_sql" ]${hibernate.show_sql}[/prop] [/props] [/property] [/bean] [bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" ] [property name="sessionFactory" ref="sessionFactory" /] [/bean] [context:component-scan base-package="barii" scoped-proxy="targetClass" /] [context:property-placeholder location="classpath:jdbc.properties" /] [tx:annotation-driven transaction-manager="hibernateTransactionManager" /] [bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"] [property name="formatters"] [set] [ref bean="topicFormatter"/] [/set] [/property] [/bean] [bean id="topicFormatter" class="barii.formatters.TopicFormatter"/] [/beans] Kimenet ???1 ???2 SAVE: barii.model.Question@592d716b[qid=100,question=sdfg,] nov. 28, 2012 5:33:09 DU org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet dispatcher threw exception java.lang.NullPointerException at barii.controller.QuestionController.addContact(QuestionController.java:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:722)

Hozzászólások

Én ez elé a sor elé tenném, mivel itt száll el: QuestionController.addContact(QuestionController.java:45)

Érdemes lehet azt a sort, amiben több művelet van több sorba szétcsapni, akkor a kiadott sorból azonnal látszik, hogy hol van az NPE. Persze a debuggert léptetve is kiderül, ez csak ízlés kérdése.

System.out.println("SAVE: "+question.toString());
System.out.println("SAVE: "+question.getTopic().getTopicname());

a másodikban száll el, mert a topic null.. Én ezt tudom.. csak azt nem, hogy miért nem fut le a parse
---
Ubuntu one tárhely: https://one.ubuntu.com/referrals/referee/1503/
Dropbox: http://db.tt/XMk0ssk

Jobbat mondok, itt a komplett forras, a jtranslate-app -on belul keresgelj, ezen belul is a me.hron.jtranslate.app.TranslateController az, ami teged erdekelni fog controller oldalon, es a WEB-INF/views/translate/index.jspx.

Az enumot a jtranslate-api -ban talalod meg, a me.hron.jtranslate.core.Language osztalyban.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal