Why Java Beans have to be serializable? - java

Is it necessary that a Java Bean implements the Serializable interface?

It's one of the "typical" features as described in the Javabeans specification.
Here's an extract of chapter 2.1 What is a bean?
Individual Java Beans will vary in the functionality they support, but the typical unifying features
that distinguish a Java Bean are:
Support for “introspection” so that a builder tool can analyze how a bean works
Support for “customization” so that when using an application builder a user can
customize the appearance and behaviour of a bean.
Support for “events” as a simple communication metaphor than can be used to connect
up beans.
Support for “properties”, both for customization and for programmatic use.
Support for persistence, so that a bean can be customized in an application builder and
then have its customized state saved away and reloaded later.
And here's an extract of chapter 5.5 Summary of Persistence:
All beans must support either Serialization or Externalization.
In practice, it's not explicitly necessary for it to function. It will in general also just work fine without implementing Serializable. It's however useful whenever you'd like to store them "plain" on harddisk or send "plain" over network. For example when it's a session scoped bean which is to be stored in the HTTP session and the server is been confugured to persist and revive HTTP sessions during shutdown/restart. At any way, whenever you face a NotSerializableException with the bean's full qualified classname in the message, then it's enough sign to let it implement Serializable.

Yes.
By definition - a Java bean is exactly that, a serializable POJO (plain old Java object), with a no-argument constructor and private fields with getters/setters.

Related

How many proxies created in Java application use Spring core, Hibernate, Spring AOP?

I'm reading about Java proxy and as we know Spring Core, Hibernate, Spring AOP, Ehcache is an implement of it. I have got confused cause SpringCore will create a proxy, Hibernate will create a proxy and SpringAOP or Ehcache will do the same if we use all of them in a Java project.
How many proxies will create? Can someone help me out this problem and give me some example?
Each of those frameworks create any variable number of proxies all based upon certain design choices and configurations. That said, the only way to have any idea would be to profile your application.
Most frameworks that use proxies leverage them for similar reasons. These proxies are meant to act as placeholders that look like an object our code knows about and works with; however the internal implementation details are hidden, often supplemented with framework specific business logic.
For example, hibernate may expose a lazily-loaded collection of objects as a collection of proxies. Each proxy looks like the object our application expects in that collection; however, the internal state of that proxy is often not yet loaded until first accessed. In this case, the proxy saves on memory consumption, result-set parsing and database bandwidth, and a plethora of other things.

Clean way to wire variables after serialization?

I've got a web application ( tomcat 7, spring 4.2, ZK 7). As I have two servers that can "take over" the other's sessions, serialization of the sessions is required, which leads to the problem that I have to somehow re-initialize the spring services after deserialization. Due to the structure of ZK, it is required that the Composers (kind of Controllers) need to be serialized (and these Composers use Services).
For example, let's say I have an object that needs to be serialized. This objects has a reference to a Spring service (which cannot be serialized, since in the end, there's a reference to a DataSource, SqlSessionTemplate, etc. - all of them not Serializable).
So, now how to solve this problem elegantly? Is there some way to integrate Spring into the deserialization process so that Spring automatically re-wires my (transient, autowired) variables after (or even while) deserialization?
The current solution is to have a singleton bean lying around that has a #Autowired reference to the ApplicationContext, so that I can access it via getInstance() to get a reference to a Service, but this solution is not very elegant and also makes testing more complex (since I prefer to unit test without loading a Spring context).
Is there some other, preferably better, way to do this?
It seems, that the most obvious and elegant answer is to declare the ScopedProxyMode of a bean, that wraps it into a Proxy and dynamically sets the non-serializable dependencies, for example...
#Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)
More can be found in the Spring documentation here. This also has been discussed here on StackOverflow already (with a link to the presentation when they announced it).

Method Validation with JSR-303/JSR-349 in a library

I am writing a library which contains a domain model and uses the Bean Validation API. My goal is to have minimal amount of dependencies. Hence, without CDI, Java EE and Spring. Allowed Dependencies are to APIs only like JSR-349 and JSR-330 API.
I can not make any assumptions about how my library is going to be used. It might be within a container or as desktop application. Forcing the library user to have an CDI, Spring, or validation implementation is not an option.
Right now, I use the bean validation API to allow the user of my library to validate the model itself. But I would also like to use Method Validation in some cases.
My questions are:
What options do I have if I want to use method validation within a
library project?
Do I have to ship my library with an aspectj runtime dependency?
Does it make sense to use Method Validation in a domain model?
How is your library going to be used? Chances are that applications using it are running within CDI, Spring or another kind of container anyways, then delegating method validation to the same would be sensible.
If you really want to go for your own solution, it really depends on how the instances of your domain model are created. If you have interfaces and the user obtains instances via a factory, you might have a look at JDK dynamic proxies. Alternatively, you could check out Javassist or Cglib if you don't work with interfaces but with classes. That'd still require that your domain model nodes are obtained via a factory in order to return properly proxied instances.
Whether it makes sense or not surely depends on your specific model and its use cases. When it comes to validation of a model, property (and class-level) validation surely is the more common case, but if you provide business methods on your model and want to validate their parameters or return values, it may make sense.
1) without CDI I would recommend apache BVal or any jsr303 specific implementation that does not require being container managed.
Since the jsr targets the java-ee platform it seems some container must manage it. what container you choose depends on the extra dependencies that must be shipped with the application.
Bval itself does not require anything other some core apache helper libraries.
2) Bval and other implementations of the jsr303 spec will need some kind of java ee container. It is a backing principle behind java ee. If no java-ee enviroment is present, bval will require a di framework to hook into.
If guice is chosen as the container; it uses cglib for its bytecode and it uses aop alliance interfaces for its aop (implemented internally with the help of cglib).
Spring does require aspectj.
If CDI is chosen, it would depend on the CDI implementation used.
3) If you are attempting to simply do method level validation, it does make sense to simply do the validation by hand in the class setter/getter itself. Specially if you want to remain platform independant.
Method level validation through the use of third party libraries only makes sense when you are using third party containers. If you are trying to have a base simple java se application, it does make a great deal of sense to put the validation in the data objects themselves and have your exception handling strategy take care of issues to the user.
The answer to three will always be rather subjective, but if you really are not looking to use a mass amount of frameworks, I don't think its bad practice to do the validation in the methods themselves.

javabean vs servlet [duplicate]

This question already has answers here:
What is a JavaBean exactly?
(23 answers)
Closed 6 years ago.
I was searching for difference between javabean and servlet. I found
Servlet corresponds a Controller
JavaBean corresponds a Model
and
java bean is a reusable component,where as the servlet is the java
program which extends the server capability
Now, what does re-usable means in javabean. Can't we re-use servlet ?
I will appreciate, if anyone can explain this, with few examples.
Servlets and JavaBeans are completely different concepts. The servlet API provides for servicing Internet requests, typically from client browsers but not limited to that.
JavaBeans are a component architecture for encapsulating functionality. A typical use would be a bean used by a servlet to handle database inquiries, but bean architecture is used in lots of places.
Sessions are the servlet mechanism for storing objects related to a particular user, these objects may or may not be beans. Beans used to create user interfaces (with your clever IDE) have more stringent requirements. Beans used in servlets and JSP are typically simpler.
Making it more straight, JavaBeans are to Java what ActiveX controls are to Microsoft. Javabeans can run on server side, client side, within an applet etc.
So, both have nothing in common except Java.
JavaBeans and Servlet are both concepts part of the Java EE (Java Enterprise Edition) package release in 1999/2000.
The servlet is a Java class (used as an Controller) in a java Web Application. Its role is to manage the HTTP Request and generate an HTTP Response. The Servlet is using JavaBeans to get its information from the database for instance.
The JavaBean is a simple java class used to represent the model of your application. To be called a JavaBean, the class must have public getters and setters for all its properties, must have a no-argument constructor, and must be serializable.
It is interesting to understand that this simple JavaBean concept migrates to the Enterprise Java Bean (EJB) in early 2000. But experience proved that EJBs were quite complicated to managed in the Java EE environment. Consequently, Enterprise JavaBeans were mostly replaced by "Pojos" (Plain Old Java Object) popularized by IOC Containers (like Spring in 2003). IOC pulled back Javabean to its former concept. IOC replaced the overall EJB-J2EE Templating pattern, Service Locator, Business Delegate patterns to a simple Injection of Dependencies (DI).
They are two completely different things.
A servlet is used for handling requests in a web application, so yes it is similar to a controller.
A Java bean is any java class that adheres to a set of rules, see: What is a "Java Bean"?
I guess whatever you are reading is telling you how each fit into the MVC pattern
The Life cycle of Servlet manage by Web container where In case of Java Bean you are initialize or initiate your java Bean.
There are two type of servlet, Generic Servlet which support different type of protocol request where HTTPServlet which support HTTP protocol.
In most of the framework like struts/Spring, they use servlet as controller to take the request call and depends on the configuration, it's divert the call to different Action Class/Action Controller
Java bean is a data access object which is used to interact with the database.Java bean is a POJO (Plain Old Java Object).A servlet is used with the JSP, like an interface for JSP.
Both java bean and Servlet are part of the MVC.

What's the deal with web service generation and JavaBeans?

I recently wrote some data access methods (plain old Java) that use immutable objects for both the request objects and the resulting data objects. I like the immutable objects because they prevent a good deal of confusion from appearing in the client code which I've seen in the past when people attempt to mutate and reuse objects.
Anyway, that was months ago. Now a colleague is having trouble with some web service generation stuff (attempting to expose my methods) which expects everything everywhere to be a JavaBean.
My question is: does web service stuff generation stuff always mandate use of JavaBeans? Is there another way?
Most web service frameworks provide some way for you to supply custom serializers/deserializers for types. Sounds like that is what you need here.
If it isn't clear why that's necessary, it is because the framework needs to know how to translate your Java class into XML and vice versa. Serializing and deserializing JavaBeans (classes with get and set properties) is easy if you follow the naming strategy, but you should also be able to supply your custom type serializers for classes that do not follow the bean pattern.
There are two general approaches to Web service development: top-down and bottom-up.
In the top-down approach, a Web service is based on the Web service interface and XML types, defined in WSDL and XML Schema Definition (XSD) files. The developer first designs the implementation of the Web service by creating a WSDL file. From this skeleton Java classes can be created to which the developer can add the required code. This skeleton implementation serves as an interface with the business logic. This process is also one of the J2EE standard - JAX-RPC based API for Web services which defines standard mappings between Java classes and XML types.
In the bottom-up approach, a Web service is created based on the existing business logic in Java beans or EJBs. A WSDL file is generated to describe the resulting Web service interface. Seems like your colleague is using this approach.
I would recommend a top-down rather than a bottom approach as you would have more control on the interface definitions and naming. Also your colleague could use your existing classes through the tooling generated skeleton interface.

Categories

Resources